<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow-IPC: transport/channel.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow-IPC<span id="projectnumber">&#160;1.0.2</span>
   </div>
   <div id="projectbrief">Flow-IPC project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_0c017496b493ff066fbbe686970307ba.html">transport</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">channel.hpp</div></div>
</div><!--header-->
<div class="contents">
<a href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow-IPC: Core</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#pragma once</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="preprocessor">#include &quot;<a class="code" href="sync__io_2native__socket__stream_8hpp.html">ipc/transport/sync_io/native_socket_stream.hpp</a>&quot;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="preprocessor">#include &quot;<a class="code" href="native__socket__stream_8hpp.html">ipc/transport/native_socket_stream.hpp</a>&quot;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="preprocessor">#include &quot;<a class="code" href="sync__io_2blob__stream__mq__snd_8hpp.html">ipc/transport/sync_io/blob_stream_mq_snd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="preprocessor">#include &quot;<a class="code" href="blob__stream__mq__snd_8hpp.html">ipc/transport/blob_stream_mq_snd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="preprocessor">#include &quot;<a class="code" href="sync__io_2blob__stream__mq__rcv_8hpp.html">ipc/transport/sync_io/blob_stream_mq_rcv.hpp</a>&quot;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span><span class="preprocessor">#include &quot;<a class="code" href="blob__stream__mq__rcv_8hpp.html">ipc/transport/blob_stream_mq_rcv.hpp</a>&quot;</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span><span class="preprocessor">#include &quot;<a class="code" href="ipc__core_2src_2ipc_2transport_2error_8hpp.html">ipc/transport/error.hpp</a>&quot;</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span><span class="preprocessor">#include &quot;<a class="code" href="transport__fwd_8hpp.html">ipc/transport/transport_fwd.hpp</a>&quot;</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span><span class="preprocessor">#include &quot;<a class="code" href="process__credentials_8hpp.html">ipc/util/process_credentials.hpp</a>&quot;</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span> </div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceipc_1_1transport.html">ipc::transport</a></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span>{</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span> </div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span><span class="comment">// Types.</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span><span class="comment"></span> </div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><span class="comment">/**</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span><span class="comment"> * Peer to a bundle of 1-2 full-duplex pipe(s), one for transmitting unstructured binary blobs; the other for</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span><span class="comment"> * transmitting native handle+blob combos; hence a Blob_sender + Blob_receiver, a Native_handle_sender +</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span><span class="comment"> * Native_handle_receiver, or both.  Generally a session::Session shall be in charge of opening</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span><span class="comment"> * such `Channel`s between processes, while the user will likely wrap each Channel in a struc::Channel in order</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span><span class="comment"> * to exchange structured (schema-based) messages, at times along with native sockets, through those `Channel`s.</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span><span class="comment"> * (However this is by no means required.  One can use the `Channel` -- whether bundling async-I/O peer objects or</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span><span class="comment"> * their `sync_io::` counterparts -- directly (in unstructured form) as well.)</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span><span class="comment"> *</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="comment"> * ### Main use: bundler of peer sender/receiver objects ###</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="comment"> *</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span><span class="comment"> * This bundling of the local peer objects of 1-2 pipes is the Channel template&#39;s core functionality;</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span><span class="comment"> * it is therefore (data-wise -- but code-wise as well) an *extremely* thin wrapper around the stored 2-4 peer</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span><span class="comment"> * objects.  At its core it provides:</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span><span class="comment"> *   - construction in ??? state;</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span><span class="comment"> *   - accessors for the peer objects (`Blob_sender`/`Blob_receiver`, which may be the same object or not; or</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span><span class="comment"> *     `Native_handle_sender`/`Native_handle_receiver`, ditto; or both);</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span><span class="comment"> *   - simple API for loading up the objects that shall be returned by those accessors.</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span><span class="comment"> *</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span><span class="comment"> * @note A key point is that, since we&#39;re really just storing 2-4 pointers (+ a nickname and a `Logger`),</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span><span class="comment"> *       there is important freedom as to the pointees&#39; *types*.  The `Blob_sender` can be either Null_peer</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span><span class="comment"> *       (i.e., unused), a transport::Blob_sender (async-I/O pattern), *or* a transport::sync_io::Blob_sender</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span><span class="comment"> *       (`sync_io` pattern; see util::sync_io doc header for background).  (And analogously for</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span><span class="comment"> *       each of `Blob_receiver`, `Native_handle_sender`, `Native_handle_receiver`.)  So in other words</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span><span class="comment"> *       a `Channel` can bundle async-I/O peer objects *or* `sync_io` peer objects.  You may use</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno">   61</span><span class="comment"> *       Channel::S_IS_SYNC_IO_OBJ or Channel::S_IS_ASYNC_IO_OBJ to determine which is the case at compile-time</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span><span class="comment"> *       for a given Channel type.</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span><span class="comment"> *</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span><span class="comment"> * Accordingly it provides a very useful method: async_io_obj().  If you have a `sync_io`-pattern-peer-storing</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span><span class="comment"> * Channel `x` (i.e., `&quot;decltype(x)::S_IS_SYNC_IO_OBJ == true&quot;`), simply call `x.async_io_obj()` to create/return</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span><span class="comment"> * an async-I/O version of it.  For example, is `x` was</span></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span><span class="comment"> * `Channel&lt;transport::sync_io::Native_socket_stream, Null_peer, Null_peer, Null_peer&gt;` containing</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span><span class="comment"> * a single sync_io::Native_socket_stream core (acting as a blob-sender and -receiver), then</span></div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span><span class="comment"> * `x.async_io_obj()` shall return a new channel object with the same structure but with</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span><span class="comment"> * a new *async*-I/O-pattern (i.e., auto-parallelizing, async-acting) transport::Native_socket_stream</span></div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span><span class="comment"> * which was constructed using the `sync_io`-core-adopting ctor form (per transport::Blob_sender and</span></div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span><span class="comment"> * transport::Blob_receiver concept).</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span><span class="comment"> *</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span><span class="comment"> * Generally speaking, APIs such as ipc::session (e.g., session::Session_server::async_accept())</span></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span><span class="comment"> * and ipc::transport (e.g., transport::Native_socket_stream::async_accept()) will create</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span><span class="comment"> * and subsume objects in their `sync_io`-pattern form, sometimes called *cores*.  These are lighter-weight</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span><span class="comment"> * (compared to async-I/O ones) and don&#39;t auto-start background threads for example.  Yet whenever you want</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span><span class="comment"> * the async-I/O goodies (and you *do* want them) simply `.async_channel()` to get yourself that guy from</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span><span class="comment"> * the `sync_io` *core*.</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span><span class="comment"> *</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span><span class="comment"> * @note Notably struc::Channel (and struc::sync_io::Channel, should you wish to use one directly)</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span><span class="comment"> *       subsumes a `Channel::S_IS_SYNC_IO_OBJ == true` unstructured Channel in every constructor form offered.</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span><span class="comment"> *</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span><span class="comment"> * ### Secondary use: itself a peer object: forwarding to stored peers ###</span></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span><span class="comment"> * As a nicety, a Channel itself implements the concepts implemented by each of its stored objects, forwarding API</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span><span class="comment"> * calls to it.  For example, if it bundles a Blob_sender and a Native_handle_sender, then it will itself have</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span><span class="comment"> * send_blob() and send_native_handle(), forwarding to the stored Blob_sender and Native_handle_sender respectively.</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span><span class="comment"> *   - For the main transmission methods, which have almost identical signatures in the `transport::` and</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span><span class="comment"> *     `transport::sync_io::` sender/receiver concepts, each method simply forwards to the appropriate stored</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span><span class="comment"> *     peer object.  Therefore they can be seen as simple syntactic sugar -- it is really just forwarding.</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span><span class="comment"> *     - Blob_sender: send_blob(), send_blob_max_size().</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span><span class="comment"> *     - Native_handle_sender: send_native_handle(), send_meta_blob_max_size().</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span><span class="comment"> *     - Blob_receiver: async_receive_blob(), receive_blob_max_size().</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span><span class="comment"> *     - Native_handle_receiver: async_receive_native_handle(), receive_meta_blob_max_size().</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span><span class="comment"> *   - For the secondary transmission methods, which *also* coincide among certain concepts within</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span><span class="comment"> *     each of those 2 (sync-versus-async) groups, the methods have a combined action for your convenience.</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span><span class="comment"> *     Therefore they actually do something you might find algorithmically helpful rather than mere forwarding.</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span><span class="comment"> *     Here I would single out async_end_sending() specifically.</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span><span class="comment"> *     - Blob_sender, Native_handle_sender:</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span><span class="comment"> *       - auto_ping(): Enables auto-pinging with the same frequency on all (1-2) stored out-pipes.</span></div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span><span class="comment"> *       - end_sending(), async_end_sending(): Performs that operation on all (1-2) stored out-pipes.</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span><span class="comment"> *         `async_end_sending(F)` invokes completion handler `F()` only once *all* (1-2) out-pipes have finished</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span><span class="comment"> *         (this may save you code having to worry about it).</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span><span class="comment"> *         - There is an overload for each of `S_IS_SYNC_IO_OBJ` and `S_IS_ASYNC_IO_OBJ` `Channel` forms</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span><span class="comment"> *     - Blob_receiver, Native_handle_receiver:</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span><span class="comment"> *       - idle_timer_run(): Enables idle-timer with the same idle-timeout on all (1-2) stored in-pipes.</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span><span class="comment"> *</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span><span class="comment"> * In addition the following `transport::sync_io::` methods are available as syntactic sugar if and only if</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span><span class="comment"> * `S_IS_SYNC_IO_OBJ`.</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span><span class="comment"> *   - These method names do not coincide among concepts and therefore are simple forwards:</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span><span class="comment"> *     - Blob_sender:</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span><span class="comment"> *       start_send_blob_ops().</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span><span class="comment"> *     - Native_handle_sender:</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span><span class="comment"> *       start_send_native_handle_ops().</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span><span class="comment"> *     - Blob_receiver:</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span><span class="comment"> *       start_receive_blob_ops().</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span><span class="comment"> *     - Native_handle_receiver:</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span><span class="comment"> *       start_receive_native_handle_ops().</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span><span class="comment"> *   - This method coincides among all 4 potential concepts:</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span><span class="comment"> *     replace_event_wait_handles().</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span><span class="comment"> *     - It invokes the stored peer objects&#39; method of the same name.</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span><span class="comment"> *</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span><span class="comment"> * ### How to use: type, initialization ###</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span><span class="comment"> * A Channel stores a `Blob_sender` and `Blob_receiver`; or a `Native_handle_sender` and `Native_handle_receiver`;</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span><span class="comment"> * or both.</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span><span class="comment"> *</span></div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span><span class="comment"> * The latter is termed the *handles pipe*; the former the *blobs pipe*.  A Channel can be 1 of 2 Channel peers</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span><span class="comment"> * to a pipe bundle containing either the handles pipe, the blobs pipe, or both.  This setting is specified</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span><span class="comment"> * during *initialization* and cannot be changed after that for a given `*this`.  Initialization consists of</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span><span class="comment"> * the following simple steps:</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span><span class="comment"> *   - Select the concrete types for `Blob_*er` and `Native_handle_*er` at construction time when specifying</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span><span class="comment"> *     the concrete Channel type.</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span><span class="comment"> *     - Determine whether the types shall be async-I/O-pattern-implementing (from ipc::transport directly) or</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span><span class="comment"> *       sync-I/O-pattern implementing (from transport::sync_io).  In the latter case we assume you will mentally add</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span><span class="comment"> *       the `sync_io::` qualifier below where applicable.</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span><span class="comment"> *       - This shall determine whether Channel::S_IS_ASYNC_IO_OBJ or Channel::S_IS_SYNC_IO_OBJ.</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span><span class="comment"> *     - For each pipe you *do not* want to use, specify Null_peer as the type.</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span><span class="comment"> *     - For each pipe you *do* want to use, specify a class implementing that concept.</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span><span class="comment"> *       The other (opposing) peer must specify a matching Channel type.</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span><span class="comment"> *       - As of this writing: Blob_sender and Blob_receiver can be `Native_socket_stream`;</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span><span class="comment"> *         Blob_sender can also be `Blob_stream_mq_sender&lt;Mq&gt;` (or the specific aliases</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span><span class="comment"> *         `Posix_mq_sender`, `Bipc_mq_sender`); `Blob_receiver` can be `Blob_stream_mq_receiver&lt;Mq&gt;`</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span><span class="comment"> *         (aliases `Posix_mq_receiver`, `Bipc_mq_receiver`).</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span><span class="comment"> *       - As of this writing: Native_handle_sender and Native_handle_receiver can be Native_socket_stream.</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span><span class="comment"> *     - Example: `Channel&lt;Posix_mq_sender, Posix_mq_receiver, Null_peer, Null_peer&gt;`:</span></div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span><span class="comment"> *                Blob pipe via 2 unidirectional POSIX MQs; handles pipe disabled.</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span><span class="comment"> *     - Example: `Channel&lt;Null_peer, Null_peer, Native_socket_stream, Native_socket_stream&gt;`:</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span><span class="comment"> *                Blob pipe disabled; handles pipe over a Unix domain stream socket connection.</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span><span class="comment"> *     - Example: `Channel&lt;Null_peer, Null_peer, sync_io::Native_socket_stream, sync_io::Native_socket_stream&gt;`:</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span><span class="comment"> *                Same but bundling `sync_io` cores instead of async-I/O counterparts.</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span><span class="comment"> *   - After construction, before any transmission, load the actual concrete peer objects (via move semantics)</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span><span class="comment"> *     by calling:</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span><span class="comment"> *     - Exactly one init_blob_pipe() overload, if the blob pipe is enabled.  Exactly 0 such calls if disabled.</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span><span class="comment"> *       - The 1-arg overload shall be used when the Blob_sender and Blob_receiver are one object.</span></div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span><span class="comment"> *         For example Native_socket_stream is such a class/object, because internally the full-duplex pipe</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span><span class="comment"> *         involves a single low-level transport.</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span><span class="comment"> *       - The 2-arg overload shall be used when they are separate objects.</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span><span class="comment"> *         For example #Bipc_mq_sender and #Bipc_mq_receiver are separate, because internally the full-duplex pipe</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span><span class="comment"> *         is composed of 2 opposite-facing unidirectional MQ-based pipes.</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span><span class="comment"> *     - Exactly one init_native_handle_pipe() overload, if the handles pipe is enabled.  Exactly 0 such calls if</span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span><span class="comment"> *       disabled.  (Analogous.)</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span><span class="comment"> *   - (Optional but recommended) Check initialized() and ensure it returns `true`.  Otherwise you&#39;ve failed to</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span><span class="comment"> *     follow the above instructions.  This may be reason enough to `assert(false)` or abort, but it&#39;s up to you.</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span><span class="comment"> *     In any case it is unwise, at best, to proceed with anything below.</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span><span class="comment"> *</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span><span class="comment"> * After this, initialization is finished.  The Channel is in PEER state.  One can use these approaches:</span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span><span class="comment"> *   - Access the peer objects via blob_snd(), blob_rcv(), hndl_snd(), hndl_rcv() (of which only the ones</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span><span class="comment"> *     enabled at compile-time -- not Null_peer in that template-parm slot -- shall compile).  Use their APIs as</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span><span class="comment"> *     desired.</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span><span class="comment"> *   - Use the concept-implementing forwarding API (&quot;Secondary use&quot; above) on `*this` itself.</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span><span class="comment"> *</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span><span class="comment"> * Informally: one approach to retain sanity might be -- for a given `*this` -- to use one or the other approach</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span><span class="comment"> * (for a given object), not both.</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span><span class="comment"> *</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span><span class="comment"> * ### Aliases to Channel ###</span></div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span><span class="comment"> * To make it much easier to intantiate and initialize a concrete Channel, there are several aliases and glorified</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span><span class="comment"> * aliases (data-free sub-classes).  See transport_fwd.hpp for the aliases and the present channel.hpp for the</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span><span class="comment"> * glorified aliases.  For example:</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span><span class="comment"> *   - #Posix_mqs_socket_stream_channel (or sync_io::Posix_mqs_socket_stream_channel) is a &quot;full bundle&quot;:</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span><span class="comment"> *     a POSIX MQ-based full-duplex blobs pipe; a Unix domain socket-based full-duplex handles pipe.</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span><span class="comment"> *   - Socket_stream_channel is a &quot;half-bundle&quot;: a Unix domain socket-based handles pipe only</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span><span class="comment"> *     (template param `SIO` determines whether Native_socket_stream or sync_io::Native_socket_stream).</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span><span class="comment"> *   - #Bipc_mqs_channel_of_blobs (or sync_io::Bipc_mqs_channel_of_blobs) is a &quot;half-bundle&quot;:</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span><span class="comment"> *     a bipc MQ-based full-duplex blobs pipe only.</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span><span class="comment"> *</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span><span class="comment"> * Generally such convenience types do not require any init_blob_pipe() or init_native_handle_pipe() calls;</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span><span class="comment"> * one supplies what&#39;s necessary at construction time, and the ctor makes those needed calls for the user.</span></div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span><span class="comment"> *</span></div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span><span class="comment"> * This really applies only when creating `Channel`s *not* via ipc::session -- in its case the exact `Channel`</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span><span class="comment"> * type is determined internally to ipc::session: you can not worry about typing or construction and just use</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span><span class="comment"> * the guy.  However someone somewhere does need to actually type and create a `Channel`.</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span><span class="comment"> *</span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span><span class="comment"> * Please realize that it is safe and appropriate to `static_cast&lt;&gt;` between pointers/references of any Channel type</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span><span class="comment"> * to any other Channel type: all that has to be true between a given pair of types `C1` and `C2` is:</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span><span class="comment"> * `is_same_v&lt;C1::Blob_sender_obj, C2::Blob_sender_obj&gt; == true`, repeated for `Blob_receiver_obj`,</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span><span class="comment"> * `Native_handle_sender_obj`, `Native_handle_receiver_obj`.</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span><span class="comment"> *</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span><span class="comment"> * ### ??? versus PEER states; pipe interaction ###</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span><span class="comment"> * A Channel contains minimal logic.  It&#39;s a bundling of pipe peers; and secondarily of concept implementations.</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span><span class="comment"> *</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span><span class="comment"> * In that secondary role, befitting a Blob_sender, Blob_receiver, and/or Native_handle_sender, Native_handle_receiver:</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span><span class="comment"> * A Channel `*this` is in one of 2 states:</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span><span class="comment"> *   - During initialization: ??? state.</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span><span class="comment"> *   - After initialization: PEER state.  The peer objects have been moved-into `*this`: it can now transmit.</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span><span class="comment"> *</span></div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span><span class="comment"> * As per those concepts: The only way to exit PEER state is to move-from `*this` which makes it ??? (as-if</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span><span class="comment"> * default-cted) again.</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span><span class="comment"> *</span></div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span><span class="comment"> * As of this writing, in ??? state methods other than `init*()` and the basic accessors shall have undefined</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span><span class="comment"> * behavior.  In PEER state however they shall all strive to do work (per concepts).  There&#39;s technically also</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span><span class="comment"> * the no-man&#39;s-land wherein one has called some but not all intended `init_*_pipe()` calls.  Behavior is similarly</span></div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span><span class="comment"> * undefined in that no-man&#39;s-land.</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span><span class="comment"> *</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span><span class="comment"> * To restate, indeed a Channel contains minimal logic and mainly bundles 1-2 pipes, supplying at least</span></div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span><span class="comment"> * 1 bidirectional pipe and optionally a way to transmit native handles along one if desired.  Mostly its API</span></div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span><span class="comment"> * keeps the pipes (if there are indeed 2) separate: send_blob() affects one, send_native_socket() affects the</span></div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span><span class="comment"> * other; the calls do not interact; similarly for receiving.  What minimal interaction does occur does so</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span><span class="comment"> * in those APIs that have identical signatures in each concept pair Native_handle_sender/Blob_sender,</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span><span class="comment"> * Native_handle_receiveir/Blob_receiver.  These interactions are documented in the respective methods&#39; doc</span></div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span><span class="comment"> * headers.  For example `async_end_sending(F)` shall invoke `F()`, once each pipe&#39;s individual `*end_sending()`</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span><span class="comment"> * has completed; and errors (if any) will be reported in a particular way.  Additionally note the following:</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span><span class="comment"> *</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span><span class="comment"> * ### Note on error handling/pipe hosing ###</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span><span class="comment"> * Again `*this` is just bundling some senders/receivers.  To begin with, a sender and receiver for one</span></div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span><span class="comment"> * of the pipes (if there are two; or simply *the* pipe otherwise) might be the same object, such as</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span><span class="comment"> * with Native_socket_stream; or separate ones such as Blob_stream_mq_sender and Blob_stream_mq_receiver.</span></div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span><span class="comment"> * Furthermore there might be 2 pipes, one for blobs, the other for sockets.  Now: Consider &quot;pipe hosing.&quot;</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span><span class="comment"> * A pipe is hosed (permanently) when an error is emitted to the async transmission methods</span></div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span><span class="comment"> * async_receive_blob(), async_receive_native_handle(), or `*end_sending()`; or (in most cases) the synchronous</span></div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span><span class="comment"> * ones send_blob(), send_native_handle().  The question is... *which* pipe is hosed?  The answer: it depends</span></div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span><span class="comment"> * on what is being bundled here and the type of error.  If Native_socket_stream::send_blob() fails</span></div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span><span class="comment"> * (because #Blob_sender_obj is Native_socket_stream), with system error connection-reset, then both the</span></div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span><span class="comment"> * in-pipe (within the blobs pipe) and out-pipe (ditto) are hosed, because when a Unix domain socket goes down</span></div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span><span class="comment"> * with connection-reset, that means both directions are hosed.  If async_receive_blob() fails with graceful-close</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span><span class="comment"> * error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE, then only the in-pipe is hosed, while the out-pipe is fine.</span></div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span><span class="comment"> * On the other hand with Blob_stream_mq_sender::send_blob() (because #Blob_sender_obj is Blob_stream_mq_sender),</span></div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span><span class="comment"> * no matter how it fails, it does not affect the out-pipe which is presumably run through an entirely</span></div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span><span class="comment"> * separate Blob_stream_mq_receiver, operating necessarily over a different underlying MQ.  And in either case,</span></div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span><span class="comment"> * if there is also a 2nd bidirectional pipe also bundled, then errors over the first pipe mean nothing to</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span><span class="comment"> * the second.</span></div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span><span class="comment"> *</span></div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span><span class="comment"> * So, it depends, and in non-trivial ways very much dependent on the concrete types given as template params.</span></div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span><span class="comment"> *</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span><span class="comment"> * Therefore we make an informal recommendation to the user of any Channel but especially so</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span><span class="comment"> * if programming generically (meaning without awareness of what type that particular Channel is):</span></div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span><span class="comment"> *</span></div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span><span class="comment"> * If a pipe-hosing error is detected through *any* Channel API, prefer to subsequently treat the other pipes</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a8eff22e594b6fe82f94f13d6a172537f">  248</a></span><span class="comment"> * as hosed (even if it/they may still be capable of operating).  Stop using the Channel; consider</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span><span class="comment"> * invoking `async_end_sending(F)` (or `sync_io`-pattern form `async_end_sending(E, F)`); and once `F()` is</span></div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span><span class="comment"> * executed (or `sync_io` equivalent; or `*end_sending()` returns `false`) then perhaps</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span><span class="comment"> * destroy `*this`.  Do not try to keep using any remaining 1- or 2-directional pipe(s).</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span><span class="comment"> *</span></div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span><span class="comment"> * Your code will be simpler -- probably without losing much functionality.</span></div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span><span class="comment"> *</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span><span class="comment"> * A potential exception to this rule of thumb *could* be error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE, as it</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span><span class="comment"> * indicates the graceful closing of an in-pipe, while the out-pipe could be fine... but not really;</span></div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span><span class="comment"> * because what about the other bidirectional pipe (if applicable)?  That one is fine all-around, both directions;</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span><span class="comment"> * so now what?</span></div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span><span class="comment"> *</span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span><span class="comment"> * Therefore in our opinion it is really best, typically, to look for any 1-direction-pipe-hosing error, and once</span></div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">  261</span><span class="comment"> * detected:</span></div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span><span class="comment"> *   -# End regular use of `*this` Channel.</span></div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span><span class="comment"> *   -# (Optional depending on sensitivity of your task/data) Invoke `async_end_sending()`.  If it returns `false`,</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span><span class="comment"> *      or once the completion handler executes (or the `sync_io` form synchronously succeeds):</span></div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span><span class="comment"> *   -# Destroy `*this` Channel (to avoid unnecessary resource use including background threads in the</span></div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span><span class="comment"> *      async-I/O-pattern case).</span></div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span><span class="comment"> *</span></div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span><span class="comment"> * ### Thread safety ###</span></div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span><span class="comment"> * This flows out of understanding the above explanation wherein it is shown that: Strictly after</span></div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span><span class="comment"> * initialization and excluding the acting-on-the-bundle methods end_sending(), async_end_sending(), auto_ping(),</span></div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span><span class="comment"> * idle_timer_run(), the rest of the methods -- most notably `async_receive_*()` and</span></div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span><span class="comment"> * `send_*()` -- operate on each pipe (if there are 2, not 1) independently.  Therefore async_receive_blob()</span></div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span><span class="comment"> * work occurs on entirely separate data from async_receive_native_handle() work; and similarly</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span><span class="comment"> * send_blob() versus send_native_handle().  Therefore running such operations concurrently is safe.</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span><span class="comment"> *</span></div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span><span class="comment"> * Certainly, post-initialization, accessors `{blob|hndl}_{snd|rcv}()` are safe to invoke concurrently.</span></div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span><span class="comment"> *</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span><span class="comment"> * @tparam Blob_sender</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span><span class="comment"> *         Implements that concept in `transport::` or `transport::sync_io::` if blobs pipe enabled; else Null_peer.</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span><span class="comment"> *         If not Null_peer, and another 1 of remaining 3 parameters is not Null_peer, then they must both be</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span><span class="comment"> *         in `transport::` or both in `transport::sync_io::`.</span></div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span><span class="comment"> * @tparam Blob_receiver</span></div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span><span class="comment"> *         Implements that concept in `transport::` or `transport::sync_io::` if blobs pipe enabled; else Null_peer.</span></div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span><span class="comment"> *         If not Null_peer, and another 1 of remaining 3 parameters is not Null_peer, then they must both be</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span><span class="comment"> *         in `transport::` or both in `transport::sync_io::`.</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span><span class="comment"> * @tparam Native_handle_sender</span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span><span class="comment"> *         Implements that concept in `transport::` or `transport::sync_io::` if handles pipe enabled; else Null_peer.</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span><span class="comment"> *         If not Null_peer, and another 1 of remaining 3 parameters is not Null_peer, then they must both be</span></div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span><span class="comment"> *         in `transport::` or both in `transport::sync_io::`.</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span><span class="comment"> * @tparam Native_handle_receiver</span></div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span><span class="comment"> *         Implements that concept in `transport::` or `transport::sync_io::` if handles pipe enabled; else Null_peer.</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span><span class="comment"> *         If not Null_peer, and another 1 of remaining 3 parameters is not Null_peer, then they must both be</span></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span><span class="comment"> *         in `transport::` or both in `transport::sync_io::`.</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span><span class="comment"> *</span></div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span><span class="comment"> * @see Blob_sender: possible implemented concept.</span></div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span><span class="comment"> * @see sync_io::Blob_sender: alternative possible implemented concept (not both).</span></div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span><span class="comment"> * @see Blob_receiver: possible implemented concept.</span></div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span><span class="comment"> * @see sync_io::Blob_receiver: alternative possible implemented concept (not both).</span></div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span><span class="comment"> * @see Native_handle_sender: possible implemented concept.</span></div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span><span class="comment"> * @see sync_io::Native_handle_sender: alternative possible implemented concept (not both).</span></div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span><span class="comment"> * @see Native_handle_receiver: possible implemented concept.</span></div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span><span class="comment"> * @see sync_io::Native_handle_receiver: alternative possible implemented concept (not both).</span></div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span><span class="comment"> */</span></div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Blob__sender.html">Blob_sender</a>, <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Blob__receiver.html">Blob_receiver</a>,</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span>         <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__sender.html">Native_handle_sender</a>, <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__receiver.html">Native_handle_receiver</a>&gt;</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html">  306</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a> :</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span>  <span class="keyword">public</span> flow::log::Log_context</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span>{</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span><span class="comment"></span> </div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span><span class="comment">  /// Alias for `Blob_sender` template parameter.</span></div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a82746276cc7379a866b12d529780900f">  313</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Blob__sender.html">Blob_sender_obj</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Blob__sender.html">Blob_sender</a>;<span class="comment"></span></div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span><span class="comment">  /// Alias for `Blob_receiver` template parameter.</span></div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#aa9a7ec2d2eedfc3b6a1d2edfb05ea6d1">  315</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Blob__receiver.html">Blob_receiver_obj</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Blob__receiver.html">Blob_receiver</a>;<span class="comment"></span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span><span class="comment">  /// Alias for `Native_handle_sender` template parameter.</span></div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#afc600491e137c9dc16c202b04885a36a">  317</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__sender.html">Native_handle_sender_obj</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__sender.html">Native_handle_sender</a>;<span class="comment"></span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span><span class="comment">  /// Alias for `Native_handle_receiver` template parameter.</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ad011bfbcfc226b9a32d97188485d9a22">  319</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__receiver.html">Native_handle_receiver_obj</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__receiver.html">Native_handle_receiver</a>;</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span> </div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span>  <span class="keyword">static_assert</span>((std::is_same_v&lt;Blob_sender_obj, Null_peer&gt; &amp;&amp; std::is_same_v&lt;Blob_sender_obj, Blob_receiver_obj&gt;)</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span>                ||</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span>                ((!(std::is_same_v&lt;Blob_sender_obj, Null_peer&gt;)) &amp;&amp; (!(std::is_same_v&lt;Blob_receiver_obj, Null_peer&gt;))),</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span>                <span class="stringliteral">&quot;Either both Blob_{send|receiv}er must be Null_peer (no blobs pipe); &quot;</span></div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span>                  <span class="stringliteral">&quot;or neither must be Null_peer (blob pipe enabled).&quot;</span>);</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span>  <span class="keyword">static_assert</span>((std::is_same_v&lt;Native_handle_sender_obj, Null_peer&gt;</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span>                   &amp;&amp; std::is_same_v&lt;Native_handle_sender_obj, Native_handle_receiver_obj&gt;)</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span>                ||</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span>                ((!(std::is_same_v&lt;Native_handle_sender_obj, Null_peer&gt;))</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span>                   &amp;&amp;</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span>                     (!(std::is_same_v&lt;Native_handle_receiver_obj, Null_peer&gt;))),</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span>                <span class="stringliteral">&quot;Either both Native_handle_{send|receiv}er must be Null_peer (no handles pipe); &quot;</span></div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span>                  <span class="stringliteral">&quot;or neither must be Null_peer (handles pipe enabled).&quot;</span>);</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span>  <span class="keyword">static_assert</span>((!(std::is_same_v&lt;Blob_sender_obj, Null_peer&gt;))</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span>                  || (!(std::is_same_v&lt;Native_handle_sender_obj, Null_peer&gt;)),</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>                <span class="stringliteral">&quot;Blob_{send|receiv}er and Native_handle_{send|receiv}er cannot both be Null_peer x 2; &quot;</span></div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>                  <span class="stringliteral">&quot;at least one pipe must be enabled.&quot;</span>);</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span><span class="comment"></span> </div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span><span class="comment">   * Assuming #S_IS_SYNC_IO_OBJ yields async-I/O counterpart; else yields</span></div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span><span class="comment">   * `Channel&lt;Null_peer, Null_peer, Null_peer, Null_peer&gt;`.</span></div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span><span class="comment">   */</span></div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ab6f7d14037e228e24a8fbd33b41e1c82">  343</a></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Async_io_obj</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&lt;<span class="keyword">typename</span> Blob_sender_obj::Async_io_obj,</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span>                               <span class="keyword">typename</span> Blob_receiver_obj::Async_io_obj,</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span>                               <span class="keyword">typename</span> Native_handle_sender_obj::Async_io_obj,</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span>                               <span class="keyword">typename</span> Native_handle_receiver_obj::Async_io_obj&gt;;</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span><span class="comment"></span> </div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span><span class="comment">   * Assuming #S_IS_ASYNC_IO_OBJ yields `sync_io` counterpart; else yields</span></div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span><span class="comment">   * `Channel&lt;Null_peer, Null_peer, Null_peer, Null_peer&gt;`.</span></div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span><span class="comment">   */</span></div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ab620c31d21118f85736b6a503fea9808">  352</a></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Sync_io_obj</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&lt;<span class="keyword">typename</span> Blob_sender_obj::Sync_io_obj,</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span>                              <span class="keyword">typename</span> Blob_receiver_obj::Sync_io_obj,</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span>                              <span class="keyword">typename</span> Native_handle_sender_obj::Sync_io_obj,</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span>                              <span class="keyword">typename</span> Native_handle_receiver_obj::Sync_io_obj&gt;;</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span> </div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span>  <span class="comment">// Constants.</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span><span class="comment"></span> </div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span><span class="comment">  /// Useful for generic programming: `true` if and only if types imply both blobs and handles pipes are enabled.</span></div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a85184d886cee9b4a0d0e7b67796a238b">  360</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a85184d886cee9b4a0d0e7b67796a238b">S_HAS_2_PIPES</a> = (!(std::is_same_v&lt;Blob_sender_obj, Null_peer&gt;))</div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span>                                        &amp;&amp;</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span>                                        (!(std::is_same_v&lt;Native_handle_sender_obj, Null_peer&gt;));<span class="comment"></span></div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span><span class="comment">  /// Useful for generic programming: `true` if and only if types imply only the blobs pipe is enabled.</span></div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a634da813ea03c07d8360a738eca002c4">  364</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a634da813ea03c07d8360a738eca002c4">S_HAS_BLOB_PIPE_ONLY</a> = (!<a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a85184d886cee9b4a0d0e7b67796a238b">S_HAS_2_PIPES</a>)</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span>                                               &amp;&amp;</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span>                                               (!(std::is_same_v&lt;Blob_sender_obj, Null_peer&gt;));<span class="comment"></span></div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span><span class="comment">  /// Useful for generic programming: `true` if and only if types imply only the handles pipe is enabled.</span></div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a717bffc2086ccf834bc7a1137c1127eb">  368</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a717bffc2086ccf834bc7a1137c1127eb">S_HAS_NATIVE_HANDLE_PIPE_ONLY</a> = (!<a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a85184d886cee9b4a0d0e7b67796a238b">S_HAS_2_PIPES</a>) &amp;&amp; (!<a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a634da813ea03c07d8360a738eca002c4">S_HAS_BLOB_PIPE_ONLY</a>);<span class="comment"></span></div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span><span class="comment">  /// Useful for generic programming: `true` if and only if types imply *at least* the blobs pipe is enabled.</span></div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#aafb0767df5f1dfb535c9467ce717f93f">  370</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#aafb0767df5f1dfb535c9467ce717f93f">S_HAS_BLOB_PIPE</a> = <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a85184d886cee9b4a0d0e7b67796a238b">S_HAS_2_PIPES</a> || <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a634da813ea03c07d8360a738eca002c4">S_HAS_BLOB_PIPE_ONLY</a>;<span class="comment"></span></div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span><span class="comment">  /// Useful for generic programming: `true` if and only if types imply *at least* the handles pipe is enabled.</span></div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ab6decf2691a2cab6c3b5187bad1e368b">  372</a></span><span class="comment"></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#ab6decf2691a2cab6c3b5187bad1e368b">S_HAS_NATIVE_HANDLE_PIPE</a> = <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a85184d886cee9b4a0d0e7b67796a238b">S_HAS_2_PIPES</a> || <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a717bffc2086ccf834bc7a1137c1127eb">S_HAS_NATIVE_HANDLE_PIPE_ONLY</a>;</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span><span class="comment"></span> </div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span><span class="comment">   * Useful for generic programming: `true` &lt;=&gt; each non-`Null_peer` peer type</span></div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span><span class="comment">   * (#Blob_sender_obj, #Blob_receiver_obj, #Native_handle_sender_obj, #Native_handle_receiver_obj)</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span><span class="comment">   * implements the `sync_io` pattern (by convention living in namespace ipc::transport::sync_io).</span></div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span><span class="comment">   */</span></div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ae5be240d29389d7b728950e85df0704e">  379</a></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#ae5be240d29389d7b728950e85df0704e">S_IS_SYNC_IO_OBJ</a></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span>    = (<a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#aafb0767df5f1dfb535c9467ce717f93f">S_HAS_BLOB_PIPE</a> &amp;&amp; std::is_same_v&lt;typename Blob_sender_obj::Sync_io_obj, Null_peer&gt;)</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span>      ||</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span>      (<a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#ab6decf2691a2cab6c3b5187bad1e368b">S_HAS_NATIVE_HANDLE_PIPE</a> &amp;&amp; std::is_same_v&lt;typename Native_handle_sender_obj::Sync_io_obj, Null_peer&gt;);<span class="comment"></span></div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span><span class="comment">   * It equals the reverse of #S_IS_SYNC_IO_OBJ.   That is all peer types are of the async-I/O pattern variety</span></div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span><span class="comment">   * (by convention living directly in namespace ipc::transport). */</span></div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a9f75b20b07eff47a69c2b1dbe5c85f84">  386</a></span>  <span class="keyword">static</span> <span class="keyword">constexpr</span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a9f75b20b07eff47a69c2b1dbe5c85f84">S_IS_ASYNC_IO_OBJ</a></div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span>    = !<a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#ae5be240d29389d7b728950e85df0704e">S_IS_SYNC_IO_OBJ</a>;</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span> </div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span><span class="comment"></span> </div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span><span class="comment">   * Default ctor (Channel is in ??? state; intended to be move-assigned).</span></div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span><span class="comment">   *</span></div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span><span class="comment">   * This ctor is informally intended for the following uses:</span></div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span><span class="comment">   *   - A moved-from Channel (i.e., the `src` arg move-ctor and move-assignment operator)</span></div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span><span class="comment">   *     becomes as-if defaulted-constructed.</span></div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span><span class="comment">   *   - A target Channel for an API that generates PEER-state Channel objects shall typically be</span></div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span><span class="comment">   *     default-cted by user before being passed to that API.</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span><span class="comment">   *</span></div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span><span class="comment">   * Therefore it would be unusual (though allowed) to make direct calls such as init_blob_pipe()</span></div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span><span class="comment">   * on a default-cted Channel without first moving a non-default-cted object into it.</span></div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span><span class="comment">   */</span></div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ae7f2b8a45af59c073fa91f74be0439d8">  403</a></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#ae7f2b8a45af59c073fa91f74be0439d8">Channel</a>();</div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span><span class="comment"></span> </div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span><span class="comment">   * Constructs Channel in ??? state with the intention to continue initialization via init_blob_pipe() and/or</span></div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span><span class="comment">   * init_native_handle_pipe() call(s).</span></div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span><span class="comment">   *</span></div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span><span class="comment">   * This ctor is informally intended for the following use:</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span><span class="comment">   *   - You create a Channel that is logger-appointed and nicely-nicknamed; then you call</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span><span class="comment">   *     init_blob_pipe() and/or init_native_handle_pipe() to move actual transmitting peer objects into `*this`,</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span><span class="comment">   *     moving `*this` into PEER state.</span></div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span><span class="comment">   *     It will retain the logger and nickname throughout.</span></div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span><span class="comment">   *</span></div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span><span class="comment">   * It may be more convenient to use an alias or data-less sub-class which typically comes with specialized</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span><span class="comment">   * ctor forms that remove or reduce the need for laborious `init_*_pipe()` calls.</span></div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span><span class="comment">   *</span></div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span><span class="comment">   *        Logger to use for subsequently logging.</span></div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span><span class="comment">   * @param nickname_str</span></div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span><span class="comment">   *        Human-readable nickname of the new object, as of this writing for use in `operator&lt;&lt;(ostream)` and</span></div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span><span class="comment">   *        logging only.</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span><span class="comment">   */</span></div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ab961f45ec4416bfa010df7b9a6e4f40a">  424</a></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#ab961f45ec4416bfa010df7b9a6e4f40a">Channel</a>(flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> nickname_str);</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span><span class="comment"></span> </div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span><span class="comment">   * Move-constructs from `src`; `src` becomes as-if default-cted (therefore in ??? state).</span></div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span><span class="comment">   *</span></div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span><span class="comment">   * @param src</span></div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span><span class="comment">   */</span></div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a6fd5dc48222a3cf3eb021fee13c50ea5">  432</a></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a6fd5dc48222a3cf3eb021fee13c50ea5">Channel</a>(<a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&amp;&amp; src);</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span><span class="comment"></span> </div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span><span class="comment">  /// Copy construction is disallowed.</span></div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a798f520982555961dbd5a6176d8d4f0b">  435</a></span><span class="comment"></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a798f520982555961dbd5a6176d8d4f0b">Channel</a>(<span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span><span class="comment"></span> </div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span><span class="comment">   * Destructor: synchronously invokes the destructors for each peer object moved-into `*this` via</span></div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span><span class="comment">   * init_blob_pipe() and/or init_native_handle_pipe().</span></div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span><span class="comment">   *</span></div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span><span class="comment">   * All the notes for the N concepts&#39; destructors apply.  In PEER state, for async-I/O peer objects,</span></div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span><span class="comment">   * any pending one-off completion handlers will be invoked with</span></div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span><span class="comment">   * error::Code::S_OBJECT_SHUTDOWN_ABORTED_COMPLETION_HANDLER -- and so on.</span></div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span><span class="comment">   */</span></div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a10d97e67296614195f8b14599944dd65">  445</a></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a10d97e67296614195f8b14599944dd65">~Channel</a>();</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span> </div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span><span class="comment"></span> </div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span><span class="comment">   * Returns `true` if and only if the required init_blob_pipe() and init_native_handle_pipe() calls have been</span></div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span><span class="comment">   * made, loading exactly the expected peer objects as the template params #Blob_sender_obj, #Blob_receiver_obj,</span></div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span><span class="comment">   * #Native_handle_sender_obj, #Native_handle_receiver_obj specify.  This is useful particularly when meta-programming</span></div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span><span class="comment">   * on top of Channel: one can call initialized() before any transmission methods to ensure the proper</span></div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span><span class="comment">   * `init_*()` calls were made.  After that it is safe to meta-program in terms of just the compile-time values</span></div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span><span class="comment">   * #S_HAS_2_PIPES, #S_HAS_BLOB_PIPE, #S_HAS_NATIVE_HANDLE_PIPE, #S_HAS_BLOB_PIPE_ONLY, #S_HAS_NATIVE_HANDLE_PIPE_ONLY,</span></div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span><span class="comment">   * #S_IS_SYNC_IO_OBJ, #S_IS_ASYNC_IO_OBJ.</span></div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno">  457</span><span class="comment">   *</span></div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span><span class="comment">   * Namely it will check that:</span></div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span><span class="comment">   *   - init_blob_pipe() was called if and only if #Blob_sender_obj is not Null_peer.</span></div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span><span class="comment">   *     - If an overload was indeed called, and its 1-arg was the one, then #Blob_sender_obj and #Blob_receiver_obj</span></div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span><span class="comment">   *       were the same type.</span></div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span><span class="comment">   *   - init_native_handle_pipe() was called if and only if #Native_handle_sender_obj is not Null_peer.</span></div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span><span class="comment">   *     - If an overload was indeed called, and its 1-arg was the one, then #Native_handle_sender_obj and</span></div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span><span class="comment">   *       #Native_handle_receiver_obj were the same type.</span></div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span><span class="comment">   *</span></div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span><span class="comment">   * If this returns `false`, formally, behavior is undefined, if one attempts transmission.</span></div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span><span class="comment">   * Informally, likely some intended-for-use transmission methods will always return `false` and no-op;</span></div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span><span class="comment">   * but the best recommendation is: If this returns `false`, do not use `*this` for transmission.</span></div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span><span class="comment">   *</span></div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span><span class="comment">   * @param suppress_log</span></div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span><span class="comment">   *        If and only if `true`, returning `false` shall not be explained via logging.</span></div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span><span class="comment">   *        This may be useful when one merely wants to check whether `*this` is in default-cted state</span></div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span><span class="comment">   *        without implying that&#39;s a terrible thing.</span></div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span><span class="comment">   */</span></div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a43c79955b3ad0eab347550b4263523ec">  476</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a43c79955b3ad0eab347550b4263523ec">initialized</a>(<span class="keywordtype">bool</span> suppress_log = <span class="keyword">false</span>) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span><span class="comment"></span> </div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span><span class="comment">   * Move-assigns from `src`; `*this` acts as if destructed; `src` becomes as-if default-cted (therefore in ??? state).</span></div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span><span class="comment">   * No-op if `&amp;src == this`.</span></div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span><span class="comment">   *</span></div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span><span class="comment">   * @see ~Channel().</span></div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span><span class="comment">   *</span></div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span><span class="comment">   * @param src</span></div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span><span class="comment">   * @return `*this`.</span></div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span><span class="comment">   */</span></div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a8f60506c8b6f4165a04626c524cb4022">  488</a></span>  <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&amp; <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a8f60506c8b6f4165a04626c524cb4022">operator=</a>(<a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&amp;&amp; src);</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span><span class="comment"></span> </div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span><span class="comment">  /// Copy assignment is disallowed.</span></div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a17af68c92d593c5eb82bbab19156352a">  491</a></span><span class="comment"></span>  <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&amp; <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a17af68c92d593c5eb82bbab19156352a">operator=</a>(<span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&amp;) = <span class="keyword">delete</span>;</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span> </div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span><span class="comment"></span> </div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span><span class="comment">   * Converts a `sync_io`-peer-bearing `*this` to a returned async-I/O-peer-bearing new Channel, while</span></div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span><span class="comment">   * `*this` becomes as-if default-cted.</span></div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span><span class="comment">   *</span></div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span><span class="comment">   * Compilable only if #S_IS_SYNC_IO_OBJ, and usable only after initialized(),</span></div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span><span class="comment">   * returns `Channel` with #S_IS_ASYNC_IO_OBJ, each peer object of which is created via</span></div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span><span class="comment">   * its respective `sync_io`-core-adopting ctors.  (For example:</span></div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span><span class="comment">   * `transport::Blob_sender(transport::sync_io::Blob_sender&amp;&amp;)`.)</span></div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span><span class="comment">   *</span></div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno">  504</span><span class="comment">   * If not initialized() behavior is undefined (assertion may trip).</span></div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span><span class="comment">   *</span></div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span><span class="comment">   * Useful, in particular, to make an async-I/O Channel from a Channel obtained from a session::Session.</span></div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span><span class="comment">   *</span></div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span><span class="comment">   */</span></div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#add016cbac936d3da6c861755ac88b7a2">  510</a></span>  <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Async_io_obj</a> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#add016cbac936d3da6c861755ac88b7a2">async_io_obj</a>();</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span><span class="comment"></span> </div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span><span class="comment">   * Pointer to the immutable owned #Blob_sender_obj; null if yet initialized.</span></div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span><span class="comment">   *</span></div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span><span class="comment">   * Compilable only if #Blob_sender_obj is not Null_peer (#S_HAS_BLOB_PIPE).</span></div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span><span class="comment">   *</span></div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span><span class="comment">   */</span></div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a9e1a2db827082d9467bf45ae0bbf64d3">  519</a></span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a82746276cc7379a866b12d529780900f">Blob_sender_obj</a>* <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a9e1a2db827082d9467bf45ae0bbf64d3">blob_snd</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span><span class="comment"></span> </div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno">  522</span><span class="comment">   * Pointer to the immutable owned #Blob_receiver_obj; null if not yet initialized.</span></div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span><span class="comment">   *</span></div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span><span class="comment">   * Compilable only if #Blob_receiver_obj is not Null_peer (#S_HAS_BLOB_PIPE).</span></div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno">  525</span><span class="comment">   *</span></div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span><span class="comment">   */</span></div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a5a34248f5e11a1dd2d5a52e07ae836e7">  528</a></span>  <span class="keyword">const</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#aa9a7ec2d2eedfc3b6a1d2edfb05ea6d1">Blob_receiver_obj</a>* <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a5a34248f5e11a1dd2d5a52e07ae836e7">blob_rcv</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span><span class="comment"></span> </div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span><span class="comment">   * Pointer to the immutable owned #Native_handle_sender_obj; null if not yet initialized.</span></div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span><span class="comment">   *</span></div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno">  533</span><span class="comment">   * Compilable only if #Native_handle_sender_obj is not Null_peer (#S_HAS_NATIVE_HANDLE_PIPE).</span></div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno">  534</span><span class="comment">   *</span></div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span><span class="comment">   */</span></div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a970d77e3a5ac117d9b60dfddbf0914fe">  537</a></span>  <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Native_handle_sender_obj</a>* <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a970d77e3a5ac117d9b60dfddbf0914fe">hndl_snd</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno">  538</span><span class="comment"></span> </div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno">  540</span><span class="comment">   * Pointer to the immutable owned #Native_handle_receiver_obj; null if not yet initialized.</span></div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span><span class="comment">   *</span></div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno">  542</span><span class="comment">   * Compilable only if #Native_handle_receiver_obj is not Null_peer (#S_HAS_NATIVE_HANDLE_PIPE).</span></div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span><span class="comment">   *</span></div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno">  545</span><span class="comment">   */</span></div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a387590af263932dbdb24bcac4b399170">  546</a></span>  <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Native_handle_receiver_obj</a>* <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a387590af263932dbdb24bcac4b399170">hndl_rcv</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span><span class="comment"></span> </div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span><span class="comment">   * Pointer to the mutable owned #Blob_sender_obj; null if yet initialized.</span></div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span><span class="comment">   *</span></div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno">  551</span><span class="comment">   * Compilable only if #Blob_sender_obj is not Null_peer (#S_HAS_BLOB_PIPE).</span></div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno">  552</span><span class="comment">   *</span></div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span><span class="comment">   */</span></div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a647bc9b6f8b9fb0b546cf3879cb5d4c1">  555</a></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a82746276cc7379a866b12d529780900f">Blob_sender_obj</a>* <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a647bc9b6f8b9fb0b546cf3879cb5d4c1">blob_snd</a>();</div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span><span class="comment"></span> </div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno">  558</span><span class="comment">   * Pointer to the mutable owned #Blob_receiver_obj; null if not yet initialized.</span></div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno">  559</span><span class="comment">   *</span></div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span><span class="comment">   * Compilable only if #Blob_receiver_obj is not Null_peer (#S_HAS_BLOB_PIPE).</span></div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span><span class="comment">   *</span></div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno">  563</span><span class="comment">   */</span></div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a87fd94fa483cabd78059a3d1d094880d">  564</a></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#aa9a7ec2d2eedfc3b6a1d2edfb05ea6d1">Blob_receiver_obj</a>* <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a87fd94fa483cabd78059a3d1d094880d">blob_rcv</a>();</div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span><span class="comment"></span> </div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span><span class="comment">   * Pointer to the mutable owned #Native_handle_sender_obj; null if not yet initialized.</span></div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno">  568</span><span class="comment">   *</span></div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span><span class="comment">   * Compilable only if #Native_handle_sender_obj is not Null_peer (#S_HAS_NATIVE_HANDLE_PIPE).</span></div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span><span class="comment">   *</span></div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno">  572</span><span class="comment">   */</span></div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#aa838026c33e4e422df7cd78d3a426b6a">  573</a></span>  <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Native_handle_sender_obj</a>* <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#aa838026c33e4e422df7cd78d3a426b6a">hndl_snd</a>();</div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno">  574</span><span class="comment"></span> </div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno">  576</span><span class="comment">   * Pointer to the mutable owned #Native_handle_receiver_obj; null if not yet initialized.</span></div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno">  577</span><span class="comment">   *</span></div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno">  578</span><span class="comment">   * Compilable only if #Native_handle_receiver_obj is not Null_peer (#S_HAS_NATIVE_HANDLE_PIPE).</span></div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno">  579</span><span class="comment">   *</span></div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno">  580</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno">  581</span><span class="comment">   */</span></div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#af4c9cd7b02193fa2e8bf1742ab87111a">  582</a></span>  <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Native_handle_receiver_obj</a>* <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#af4c9cd7b02193fa2e8bf1742ab87111a">hndl_rcv</a>();</div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno">  583</span><span class="comment"></span> </div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno">  584</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno">  585</span><span class="comment">   * Completes initialization of the *blobs pipe* by taking ownership (via move semantics) of an object that</span></div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno">  586</span><span class="comment">   * is simultaneously the #Blob_sender_obj and #Blob_receiver_obj for our end of the blobs pipe.  Call this 0 times</span></div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno">  587</span><span class="comment">   * (successfully) if blobs pipe disabled (in which case #Blob_sender_obj and #Blob_receiver_obj should both be</span></div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span><span class="comment">   * Null_peer).  Call either this or the 2-arg overload exactly 1 time (successfully) otherwise.  If you call this,</span></div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span><span class="comment">   # #Blob_sender_obj and #Blob_receiver_obj must be the same type.</span></div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno">  590</span><span class="comment">   *</span></div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span><span class="comment">   * Certain mistaken uses are caught in this method; it no-ops and returns `false` (failure):</span></div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span><span class="comment">   *   - You called this, but #Blob_sender_obj is Null_peer.</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span><span class="comment">   *   - You called this, but #Blob_sender_obj and #Blob_receiver_obj are not the same type.</span></div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno">  594</span><span class="comment">   *   - You called this after already calling an init_blob_pipe() overload successfully before.</span></div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span><span class="comment">   *</span></div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno">  596</span><span class="comment">   * The remaining mistakes are caught by initialized(), if you choose to call it before any transmission (and you</span></div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span><span class="comment">   * should):</span></div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span><span class="comment">   *   - You called this or the overload 0 times (successfully), but #Blob_sender_obj is not Null_peer.</span></div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno">  599</span><span class="comment">   *</span></div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span><span class="comment">   * Pre-condition: `snd_and_rcv` is in PEER state.  Behavior is undefined otherwise.</span></div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span><span class="comment">   * Post-condition (on success): The `*this` blobs pipe is in PEER state (transmission can begin).</span></div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span><span class="comment">   *</span></div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno">  603</span><span class="comment">   * Informal recommendation: Complete the *handles pipe* initialization, if enabled, before transmitting anything</span></div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span><span class="comment">   * over the blobs pipe, even though technically it is possible to do so immediately.</span></div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span><span class="comment">   * Use initialized() to double-check.</span></div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno">  606</span><span class="comment">   *</span></div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno">  607</span><span class="comment">   * @warning It is an error (as noted above) to call this, unless #Blob_sender_obj and #Blob_receiver_obj are the</span></div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno">  608</span><span class="comment">   *          same type.  This will no-op and return `false`.  The only reason it is not undefined behavior</span></div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno">  609</span><span class="comment">   *          (assertion trip) is so that this mistake can be caught without an `assert()`, if you choose</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno">  610</span><span class="comment">   *          to call initialized() after the init phase yourself.</span></div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno">  611</span><span class="comment">   *</span></div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno">  612</span><span class="comment">   * @note As a user, it is likely you can/should use an alias type that will take care of calling this for you.</span></div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno">  613</span><span class="comment">   *       See Channel doc header.</span></div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno">  614</span><span class="comment">   *</span></div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno">  615</span><span class="comment">   * @param snd_and_rcv</span></div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno">  616</span><span class="comment">   *        A #Blob_sender_obj *and* #Blob_receiver_obj in PEER state.</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno">  617</span><span class="comment">   * @return `true` on success; `false` on no-op due to a mistaken use listed above.</span></div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno">  618</span><span class="comment">   */</span></div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#aa8209a5adde4e5c2b3b1d8779fab0433">  619</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#aa8209a5adde4e5c2b3b1d8779fab0433">init_blob_pipe</a>(<a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a82746276cc7379a866b12d529780900f">Blob_sender_obj</a>&amp;&amp; snd_and_rcv);</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno">  620</span><span class="comment"></span> </div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno">  621</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno">  622</span><span class="comment">   * Completes initialization of the *blobs pipe* by taking ownership (via move semantics) of separate</span></div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno">  623</span><span class="comment">   * #Blob_sender_obj and #Blob_receiver_obj objects for our end of the blobs pipe.  Call this 0 times if</span></div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno">  624</span><span class="comment">   * blobs pipe disabled (in which case #Blob_sender_obj and #Blob_receiver_obj should both be Null_peer).</span></div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno">  625</span><span class="comment">   * Call either this or the 1-arg overload exactly 1 time otherwise.</span></div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno">  626</span><span class="comment">   *</span></div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno">  627</span><span class="comment">   * Certain mistaken uses are caught in this method; it no-ops and returns `false` (failure):</span></div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno">  628</span><span class="comment">   *   - You called this, but #Blob_sender_obj is Null_peer and/or #Blob_receiver_obj is Null_peer.</span></div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno">  629</span><span class="comment">   *   - You called this after already calling an init_blob_pipe() overload successfully before.</span></div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno">  630</span><span class="comment">   *</span></div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno">  631</span><span class="comment">   * The remaining mistakes are caught by initialized(), if you choose to call it before any transmission (and you</span></div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno">  632</span><span class="comment">   * should):</span></div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno">  633</span><span class="comment">   *   - You called this or the overload 0 times (successfully), but #Blob_sender_obj is not Null_peer.</span></div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno">  634</span><span class="comment">   *</span></div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno">  635</span><span class="comment">   * Pre-condition: `snd` and `rcv` are in PEER state.  Behavior is undefined otherwise.</span></div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno">  636</span><span class="comment">   * Post-condition: The `*this` blobs pipe is in PEER state (transmission can begin).</span></div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno">  637</span><span class="comment">   *</span></div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno">  638</span><span class="comment">   * Informal recommendation: Complete the *handles pipe* initialization, if enabled, before transmitting anything</span></div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno">  639</span><span class="comment">   * over the blobs pipe, even though technically it is possible to do so immediately.</span></div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno">  640</span><span class="comment">   * Use initialized() to double-check.</span></div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno">  641</span><span class="comment">   *</span></div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno">  642</span><span class="comment">   * @note As a user, it is likely you can/should use an alias type that will take care of calling this for you.</span></div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno">  643</span><span class="comment">   *       See Channel doc header.</span></div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno">  644</span><span class="comment">   *</span></div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno">  645</span><span class="comment">   * @param snd</span></div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno">  646</span><span class="comment">   *        A #Blob_sender_obj in PEER state.</span></div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno">  647</span><span class="comment">   * @param rcv</span></div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno">  648</span><span class="comment">   *        A #Blob_receiver_obj in PEER state.</span></div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno">  649</span><span class="comment">   * @return `true` on success; `false` on no-op due to a mistaken use listed above.</span></div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno">  650</span><span class="comment">   */</span></div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#abc969fa7785f5acda19a0c08bfeeb7e9">  651</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#abc969fa7785f5acda19a0c08bfeeb7e9">init_blob_pipe</a>(<a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a82746276cc7379a866b12d529780900f">Blob_sender_obj</a>&amp;&amp; snd, <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#aa9a7ec2d2eedfc3b6a1d2edfb05ea6d1">Blob_receiver_obj</a>&amp;&amp; rcv);</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno">  652</span><span class="comment"></span> </div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno">  653</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno">  654</span><span class="comment">   * Analogous to 1-arg init_blob_pipe() but as applied to the *handles pipe*.  All its notes apply by analogy.</span></div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno">  655</span><span class="comment">   *</span></div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno">  656</span><span class="comment">   * @param snd_and_rcv</span></div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno">  657</span><span class="comment">   *        A #Native_handle_sender_obj *and* #Native_handle_receiver_obj in PEER state.</span></div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno">  658</span><span class="comment">   * @return See init_blob_pipe().</span></div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno">  659</span><span class="comment">   */</span></div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a0e0e396759dab8c0930594eac3bb03ba">  660</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a0e0e396759dab8c0930594eac3bb03ba">init_native_handle_pipe</a>(<a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Native_handle_sender_obj</a>&amp;&amp; snd_and_rcv);</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno">  661</span><span class="comment"></span> </div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno">  662</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno">  663</span><span class="comment">   * Analogous to 2-arg init_blob_pipe() but as applied to the *handles pipe*.  All its notes apply by analogy.</span></div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno">  664</span><span class="comment">   *</span></div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno">  665</span><span class="comment">   * @param snd</span></div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno">  666</span><span class="comment">   *        A #Native_handle_sender_obj in PEER state.</span></div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno">  667</span><span class="comment">   * @param rcv</span></div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno">  668</span><span class="comment">   *        A #Native_handle_receiver_obj in PEER state.</span></div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno">  669</span><span class="comment">   * @return See init_blob_pipe().</span></div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno">  670</span><span class="comment">   */</span></div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#afa221b9b60aa9de1aa8dfcb0c1cabec1">  671</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#afa221b9b60aa9de1aa8dfcb0c1cabec1">init_native_handle_pipe</a>(<a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Native_handle_sender_obj</a>&amp;&amp; snd, <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Native_handle_receiver_obj</a>&amp;&amp; rcv);</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno">  672</span><span class="comment"></span> </div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno">  673</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno">  674</span><span class="comment">   * Yields `blob_snd()-&gt;` same method.</span></div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno">  675</span><span class="comment">   *</span></div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno">  676</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno">  677</span><span class="comment">   */</span></div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ab62f46ceaf85baac6820415808c3a2f2">  678</a></span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#ab62f46ceaf85baac6820415808c3a2f2">send_blob_max_size</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno">  679</span><span class="comment"></span> </div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno">  680</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno">  681</span><span class="comment">   * Yields `hndl_snd()-&gt;` same method.</span></div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno">  682</span><span class="comment">   *</span></div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno">  683</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno">  684</span><span class="comment">   */</span></div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a37e1f03a11d1e1df9148048a8a6bab62">  685</a></span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a37e1f03a11d1e1df9148048a8a6bab62">send_meta_blob_max_size</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno">  686</span><span class="comment"></span> </div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno">  687</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno">  688</span><span class="comment">   * Yields `blob_rcv()-&gt;` same method.</span></div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno">  689</span><span class="comment">   *</span></div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno">  690</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno">  691</span><span class="comment">   */</span></div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a5e181ca69bd2b38d0e3585a1d9303318">  692</a></span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a5e181ca69bd2b38d0e3585a1d9303318">receive_blob_max_size</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno">  693</span><span class="comment"></span> </div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno">  694</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno">  695</span><span class="comment">   * Yields `hndl_rcv()-&gt;` same method.</span></div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno">  696</span><span class="comment">   *</span></div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno">  697</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno">  698</span><span class="comment">   */</span></div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#afd9589e9bee2aec1574ab534cf4b3782">  699</a></span>  <span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#afd9589e9bee2aec1574ab534cf4b3782">receive_meta_blob_max_size</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno">  700</span><span class="comment"></span> </div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno">  701</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno">  702</span><span class="comment">   * Yields `blob_snd()-&gt;` same method.</span></div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno">  703</span><span class="comment">   *</span></div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno">  704</span><span class="comment">   * @param blob</span></div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno">  705</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno">  706</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno">  707</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno">  708</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno">  709</span><span class="comment">   */</span></div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a688de69c7de2aef9604b9e868feb3a9e">  710</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a688de69c7de2aef9604b9e868feb3a9e">send_blob</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">util::Blob_const</a>&amp; blob, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0);</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno">  711</span><span class="comment"></span> </div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno">  712</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno">  713</span><span class="comment">   * Yields `hndl_snd()-&gt;` same method.</span></div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno">  714</span><span class="comment">   *</span></div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno">  715</span><span class="comment">   * @param hndl_or_null</span></div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno">  716</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno">  717</span><span class="comment">   * @param meta_blob</span></div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno">  718</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno">  719</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno">  720</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno">  721</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno">  722</span><span class="comment">   */</span></div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a864cae23c5a6f318e285d4c2fe65ece4">  723</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a864cae23c5a6f318e285d4c2fe65ece4">send_native_handle</a>(<a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a> hndl_or_null, <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">util::Blob_const</a>&amp; meta_blob, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0);</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno">  724</span><span class="comment"></span> </div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno">  725</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno">  726</span><span class="comment">   * Performs `hndl_snd()-&gt;` and/or `blob_snd()-&gt;` same method, synthesizing completion handlers into one</span></div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno">  727</span><span class="comment">   * if applicable.  Invoke only after initialized() is true; else behavior is undefined.  That aside:</span></div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno">  728</span><span class="comment">   *   - If not #S_HAS_2_PIPES, then simply forwards to the appropriate one method of the enabled pipe.</span></div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno">  729</span><span class="comment">   *   - If #S_HAS_2_PIPES:</span></div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno">  730</span><span class="comment">   *     - `on_done_func()` is invoked (exactly once) if and only if both forwarded methods have completed.</span></div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno">  731</span><span class="comment">   *       - If 1-2 completions do not occur, it is not invoked.</span></div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno">  732</span><span class="comment">   *     - If that occurs, it is invoked in-place of the 2nd completion handler (chronologically in order of</span></div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno">  733</span><span class="comment">   *       completion).</span></div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno">  734</span><span class="comment">   *     - The `Error_code` passed to `on_done_func()` is:</span></div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno">  735</span><span class="comment">   *       - falsy (success) if and only both completions were successful;</span></div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno">  736</span><span class="comment">   *       - if one failed but not the other, the truthy `Error_code` from the failed completion;</span></div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno">  737</span><span class="comment">   *       - if both failed, the truthy `Error_code` from the first failed completion.</span></div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno">  738</span><span class="comment">   *</span></div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno">  739</span><span class="comment">   * Behavior is undefined (assertion may trip) if there are 2 pipes enabled; and one&#39;s `.async_end_sending()`</span></div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno">  740</span><span class="comment">   * returns `false` (dupe call), while the other `true`.  This will not occur, if you cleanly use</span></div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno">  741</span><span class="comment">   * the Channel API directly on `*this` only, as opposed to shenanigans via non-`const` blob_snd(), blob_rcv(), etc.</span></div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno">  742</span><span class="comment">   *</span></div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno">  743</span><span class="comment">   * Compilable only if #S_IS_ASYNC_IO_OBJ.</span></div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno">  744</span><span class="comment">   *</span></div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno">  745</span><span class="comment">   * @tparam Task_err</span></div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno">  746</span><span class="comment">   *         See concept API.</span></div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno">  747</span><span class="comment">   * @param on_done_func</span></div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno">  748</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno">  749</span><span class="comment">   * @return If one forwarded invocation: returns what it returned.</span></div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno">  750</span><span class="comment">   *         If two forwarded invocations: returns `true` if both returned `true`; `false` if both returned `false`;</span></div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno">  751</span><span class="comment">   *         behavior undefined if they returned conflicting values.</span></div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno">  752</span><span class="comment">   */</span></div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno">  753</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Task_err&gt;</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a37fcdfdbefd8ee7e374b0596782ad128">  754</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a37fcdfdbefd8ee7e374b0596782ad128">async_end_sending</a>(Task_err&amp;&amp; on_done_func);</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno">  755</span><span class="comment"></span> </div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno">  756</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno">  757</span><span class="comment">   * Performs `hndl_snd()-&gt;` and/or `blob_snd()-&gt;` same method, synthesizing completions into one</span></div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno">  758</span><span class="comment">   * if applicable.  Invoke only after initialized() is true; else behavior is undefined.  That aside:</span></div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno">  759</span><span class="comment">   *   - If not #S_HAS_2_PIPES, then simply forwards to the appropriate one method of the enabled pipe.</span></div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno">  760</span><span class="comment">   *   - If #S_HAS_2_PIPES:</span></div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno">  761</span><span class="comment">   *     - `on_done_func()` is invoked (exactly once) if and only if both forwarded methods have completed.</span></div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno">  762</span><span class="comment">   *       - If 1-2 completions do not occur, it is not invoked.</span></div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno">  763</span><span class="comment">   *     - If that occurs, it is invoked in-place of the 2nd completion handler (chronologically in order of</span></div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno">  764</span><span class="comment">   *       completion).</span></div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno">  765</span><span class="comment">   *     - The `Error_code` passed to `on_done_func()` is:</span></div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno">  766</span><span class="comment">   *       - falsy (success) if and only both completions were successful;</span></div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno">  767</span><span class="comment">   *       - if one failed but not the other, the truthy `Error_code` from the failed completion;</span></div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno">  768</span><span class="comment">   *       - if both failed, the truthy `Error_code` from the first failed completion.</span></div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno">  769</span><span class="comment">   *</span></div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno">  770</span><span class="comment">   * &quot;Completion&quot; in this case means the first (and only) one to occur for each pipe:</span></div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno">  771</span><span class="comment">   *   - Its individual `.async_end_sending()` yielded synchronous (immediate) completion as opposed</span></div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno">  772</span><span class="comment">   *     to error::Code::S_SYNC_IO_WOULD_BLOCK.  Or:</span></div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno">  773</span><span class="comment">   *   - It returned WOULD_BLOCK, but later (via `sync_io`-pattern machinery) its completion handler executed.</span></div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno">  774</span><span class="comment">   *</span></div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno">  775</span><span class="comment">   * Behavior is undefined (assertion may trip) if there are 2 pipes enabled; and one&#39;s `.async_end_sending()`</span></div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno">  776</span><span class="comment">   * returns `false` (dupe call), while the other `true`.  This will not occur, if you cleanly use</span></div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno">  777</span><span class="comment">   * the Channel API directly on `*this` only, as opposed to shenanigans via non-`const` blob_snd(), blob_rcv(), etc.</span></div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno">  778</span><span class="comment">   *</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno">  779</span><span class="comment">   * Compilable only if #S_IS_SYNC_IO_OBJ.</span></div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno">  780</span><span class="comment">   *</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno">  781</span><span class="comment">   * @tparam Task_err</span></div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno">  782</span><span class="comment">   *         See concept API.</span></div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno">  783</span><span class="comment">   * @param sync_err_code</span></div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno">  784</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno">  785</span><span class="comment">   *        Do realize error::Code::S_SYNC_IO_WOULD_BLOCK *is* still an error, so if this pointer is null, then</span></div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno">  786</span><span class="comment">   *        would-block *will* make this throw.</span></div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno">  787</span><span class="comment">   * @param on_done_func</span></div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno">  788</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno">  789</span><span class="comment">   * @return If one forwarded invocation: returns what it returned.</span></div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno">  790</span><span class="comment">   *         If two forwarded invocations: returns `true` if both returned `true`; `false` if both returned `false`;</span></div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno">  791</span><span class="comment">   *         behavior undefined if they returned conflicting values.</span></div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno">  792</span><span class="comment">   */</span></div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno">  793</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Task_err&gt;</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a53cbf199e2ed09b7afb216c96ab63fb0">  794</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a53cbf199e2ed09b7afb216c96ab63fb0">async_end_sending</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* sync_err_code, Task_err&amp;&amp; on_done_func);</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno">  795</span><span class="comment"></span> </div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno">  796</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno">  797</span><span class="comment">   * Performs `hndl_snd()-&gt;` and/or `blob_snd()-&gt;` same method, returning `true` if</span></div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno">  798</span><span class="comment">   * all (1-2) invoked methods returned `true`; `false` conversely.  As with async_end_sending() (either overload)</span></div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno">  799</span><span class="comment">   * behavior is undefined (assertion may trip), if one returned `true` and the other `false`.</span></div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno">  800</span><span class="comment">   *</span></div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno">  801</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno">  802</span><span class="comment">   */</span></div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a060e37759dc6f0a00d92fc23a0a09f4f">  803</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a060e37759dc6f0a00d92fc23a0a09f4f">end_sending</a>();</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno">  804</span><span class="comment"></span> </div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno">  805</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno">  806</span><span class="comment">   * Performs `hndl_snd()-&gt;` and/or `blob_snd()-&gt;` same method, returning `true` if</span></div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno">  807</span><span class="comment">   * all (1-2) invoked methods returned `true`; `false` conversely.  As with async_end_sending() (either overload)</span></div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno">  808</span><span class="comment">   * behavior is undefined (assertion may trip), if one returned `true` and the other `false`.</span></div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno">  809</span><span class="comment">   *</span></div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno">  810</span><span class="comment">   * @param period</span></div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno">  811</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno">  812</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno">  813</span><span class="comment">   */</span></div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a290395d720167759bfa1eda1e86bf123">  814</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a290395d720167759bfa1eda1e86bf123">auto_ping</a>(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a> period = boost::chrono::seconds(2));</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno">  815</span><span class="comment"></span> </div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno">  816</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno">  817</span><span class="comment">   * Yields `blob_rcv()-&gt;` same method.  Blob_receiver versus sync_io::Blob_receiver signatures differ slightly;</span></div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno">  818</span><span class="comment">   * therefore this uses param-pack perfect forwarding.</span></div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno">  819</span><span class="comment">   *</span></div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno">  820</span><span class="comment">   * @tparam Args</span></div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno">  821</span><span class="comment">   *         See above.</span></div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno">  822</span><span class="comment">   * @param args</span></div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno">  823</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno">  824</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno">  825</span><span class="comment">   */</span></div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno">  826</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Args&gt;</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a1e6d2b4ec45f629b731fe30f46aeca97">  827</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a1e6d2b4ec45f629b731fe30f46aeca97">async_receive_blob</a>(Args&amp;&amp;... args);</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno">  828</span><span class="comment"></span> </div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno">  829</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno">  830</span><span class="comment">   * Yields `hndl_rcv()-&gt;` same method.  Native_handle_receiver versus sync_io::Native_handle_receiver signatures</span></div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno">  831</span><span class="comment">   * differ slightly; therefore this uses param-pack perfect forwarding.</span></div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno">  832</span><span class="comment">   *</span></div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno">  833</span><span class="comment">   * @tparam Args</span></div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno">  834</span><span class="comment">   *         See above.</span></div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno">  835</span><span class="comment">   * @param args</span></div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno">  836</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno">  837</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno">  838</span><span class="comment">   */</span></div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno">  839</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Args&gt;</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a288e61b4e19b9621f4f978fab88bcab0">  840</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a288e61b4e19b9621f4f978fab88bcab0">async_receive_native_handle</a>(Args&amp;&amp;... args);</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno">  841</span><span class="comment"></span> </div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno">  842</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno">  843</span><span class="comment">   * Performs `hndl_rcv()-&gt;` and/or `blob_rcv()-&gt;` same method, returning `true` if</span></div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno">  844</span><span class="comment">   * all (1-2) invoked methods returned `true`; `false` conversely.  As with async_end_sending() (either overload)</span></div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno">  845</span><span class="comment">   * behavior is undefined (assertion may trip), if one returned `true` and the other `false`.</span></div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno">  846</span><span class="comment">   *</span></div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno">  847</span><span class="comment">   * @param timeout</span></div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno">  848</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno">  849</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno">  850</span><span class="comment">   */</span></div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#abf25364b49b9fdd3ba4b1541b3a50356">  851</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#abf25364b49b9fdd3ba4b1541b3a50356">idle_timer_run</a>(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a> timeout = boost::chrono::seconds(5));</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno">  852</span><span class="comment"></span> </div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno">  853</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno">  854</span><span class="comment">   * Executes same method on all unique stored peer objects; returns `true` if and only if they all did.</span></div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno">  855</span><span class="comment">   * (initialized() must be `true`; else behavior undefined.)</span></div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno">  856</span><span class="comment">   *</span></div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno">  857</span><span class="comment">   * Compilable only if #S_IS_SYNC_IO_OBJ.</span></div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno">  858</span><span class="comment">   *</span></div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno">  859</span><span class="comment">   * @tparam Create_ev_wait_hndl_func</span></div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno">  860</span><span class="comment">   *         See concept API.</span></div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno">  861</span><span class="comment">   * @param create_ev_wait_hndl_func</span></div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno">  862</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno">  863</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno">  864</span><span class="comment">   */</span></div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno">  865</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Create_ev_wait_hndl_func&gt;</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ae63c4f7dbe1a1855d46a4b4d7009d5e8">  866</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#ae63c4f7dbe1a1855d46a4b4d7009d5e8">replace_event_wait_handles</a>(<span class="keyword">const</span> Create_ev_wait_hndl_func&amp; create_ev_wait_hndl_func);</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno">  867</span><span class="comment"></span> </div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno">  868</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno">  869</span><span class="comment">   * Yields `blob_snd()-&gt;` same method.</span></div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno">  870</span><span class="comment">   *</span></div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno">  871</span><span class="comment">   * @tparam Event_wait_func_t</span></div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno">  872</span><span class="comment">   *         See concept API.</span></div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno">  873</span><span class="comment">   * @param ev_wait_func</span></div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno">  874</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno">  875</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno">  876</span><span class="comment">   */</span></div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno">  877</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Event_wait_func_t&gt;</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#aabafc3beaf1a57e4767c023d9c4f9f93">  878</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#aabafc3beaf1a57e4767c023d9c4f9f93">start_send_blob_ops</a>(Event_wait_func_t&amp;&amp; ev_wait_func);</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno">  879</span><span class="comment"></span> </div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno">  880</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno">  881</span><span class="comment">   * Yields `hndl_snd()-&gt;` same method.</span></div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno">  882</span><span class="comment">   *</span></div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno">  883</span><span class="comment">   * @tparam Event_wait_func_t</span></div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno">  884</span><span class="comment">   *         See concept API.</span></div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno">  885</span><span class="comment">   * @param ev_wait_func</span></div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno">  886</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno">  887</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno">  888</span><span class="comment">   */</span></div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno">  889</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Event_wait_func_t&gt;</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ac2413ad0e4178fc321e71b5fe4ca2ce2">  890</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#ac2413ad0e4178fc321e71b5fe4ca2ce2">start_send_native_handle_ops</a>(Event_wait_func_t&amp;&amp; ev_wait_func);</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno">  891</span><span class="comment"></span> </div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno">  892</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno">  893</span><span class="comment">   * Yields `blob_rcv()-&gt;` same method.</span></div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno">  894</span><span class="comment">   *</span></div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno">  895</span><span class="comment">   * @tparam Event_wait_func_t</span></div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno">  896</span><span class="comment">   *         See concept API.</span></div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno">  897</span><span class="comment">   * @param ev_wait_func</span></div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno">  898</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno">  899</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno">  900</span><span class="comment">   */</span></div>
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno">  901</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Event_wait_func_t&gt;</div>
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a0b00c99196fbe8c154f14dbf8f0ceb79">  902</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a0b00c99196fbe8c154f14dbf8f0ceb79">start_receive_blob_ops</a>(Event_wait_func_t&amp;&amp; ev_wait_func);</div>
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno">  903</span><span class="comment"></span> </div>
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno">  904</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno">  905</span><span class="comment">   * Yields `hndl_rcv()-&gt;` same method.</span></div>
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno">  906</span><span class="comment">   *</span></div>
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno">  907</span><span class="comment">   * @tparam Event_wait_func_t</span></div>
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno">  908</span><span class="comment">   *         See concept API.</span></div>
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno">  909</span><span class="comment">   * @param ev_wait_func</span></div>
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno">  910</span><span class="comment">   *        See concept API.</span></div>
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno">  911</span><span class="comment">   * @return See concept API.</span></div>
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno">  912</span><span class="comment">   */</span></div>
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno">  913</span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Event_wait_func_t&gt;</div>
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a61f7ffbf72ee0fe46997ae08f9adaeb2">  914</a></span>  <span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a61f7ffbf72ee0fe46997ae08f9adaeb2">start_receive_native_handle_ops</a>(Event_wait_func_t&amp;&amp; ev_wait_func);</div>
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno">  915</span><span class="comment"></span> </div>
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno">  916</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno">  917</span><span class="comment">   * Returns nickname, a brief string suitable for logging.  This is included in the output by the `ostream&lt;&lt;`</span></div>
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno">  918</span><span class="comment">   * operator as well.  This method is thread-safe in that it always returns the same value.</span></div>
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno">  919</span><span class="comment">   *</span></div>
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno">  920</span><span class="comment">   * If this object is default-cted (or moved-from), this will return a value equal to &quot;&quot;.</span></div>
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno">  921</span><span class="comment">   *</span></div>
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno">  922</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno">  923</span><span class="comment">   */</span></div>
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a212c7e77daa038fc45dc118894e80af0">  924</a></span>  <span class="keyword">const</span> std::string&amp; <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a212c7e77daa038fc45dc118894e80af0">nickname</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno">  925</span> </div>
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno">  926</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno">  927</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno">  928</span><span class="comment"></span> </div>
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno">  929</span><span class="comment">  /// Short-hand alias for stored object, lifetime [init_blob_pipe(), move-assignment or dtor].</span></div>
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a2e8f56b4542da2d66a438c4bd048236a">  930</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a2e8f56b4542da2d66a438c4bd048236a">Blob_sender_ptr</a> = std::optional&lt;Blob_sender_obj&gt;;</div>
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno">  931</span><span class="comment"></span> </div>
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno">  932</span><span class="comment">  /// Short-hand alias for stored object, lifetime [init_blob_pipe(), move-assignment or dtor].</span></div>
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a22da0e807ec4dc6c267c376d78753ed3">  933</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a22da0e807ec4dc6c267c376d78753ed3">Blob_receiver_ptr</a> = std::optional&lt;Blob_receiver_obj&gt;;</div>
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno">  934</span><span class="comment"></span> </div>
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno">  935</span><span class="comment">  /// Short-hand alias for stored object, lifetime [init_native_handle_pipe(), move-assignment or dtor].</span></div>
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a7fa3eda5e3488e989ca34a29976324d1">  936</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a7fa3eda5e3488e989ca34a29976324d1">Native_handle_sender_ptr</a> = std::optional&lt;Native_handle_sender_obj&gt;;</div>
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno">  937</span><span class="comment"></span> </div>
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno">  938</span><span class="comment">  /// Short-hand alias for stored object, lifetime [init_native_handle_pipe(), move-assignment or dtor].</span></div>
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a6d0d2590651b417db4275a9252d52119">  939</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a6d0d2590651b417db4275a9252d52119">Native_handle_receiver_ptr</a> = std::optional&lt;Native_handle_receiver_obj&gt;;</div>
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno">  940</span> </div>
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno">  941</span>  <span class="comment">// Friends.</span></div>
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno">  942</span><span class="comment"></span> </div>
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno">  943</span><span class="comment">  /// Friend of Channel.</span></div>
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno">  944</span><span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Blob_sender2, <span class="keyword">typename</span> Blob_receiver2,</div>
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno">  945</span>           <span class="keyword">typename</span> Native_handle_sender2, <span class="keyword">typename</span> Native_handle_receiver2&gt;</div>
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a296d8d152aee83c0c495f80f57daffab">  946</a></span>  <span class="keyword">friend</span> std::ostream&amp; <a class="code hl_friend" href="classipc_1_1transport_1_1Channel.html#a296d8d152aee83c0c495f80f57daffab">operator&lt;&lt;</a>(std::ostream&amp; os,</div>
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno">  947</span>                                  <span class="keyword">const</span> <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&lt;Blob_sender2, Blob_receiver2,</div>
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno">  948</span>                                                Native_handle_sender2, Native_handle_receiver2&gt;&amp; val);</div>
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno">  949</span> </div>
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno">  950</span>  <span class="comment">// Data.</span></div>
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno">  951</span><span class="comment"></span> </div>
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno">  952</span><span class="comment">  /// See nickname().</span></div>
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a705d58cfa65f6162b4a7c4f8500e1985">  953</a></span><span class="comment"></span>  std::string <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a705d58cfa65f6162b4a7c4f8500e1985">m_nickname</a>;</div>
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno">  954</span><span class="comment"></span> </div>
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno">  955</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno">  956</span><span class="comment">   * The #Blob_sender_obj (sender along the blobs pipe).  Lifetime is between init_blob_pipe() and move/dtor.</span></div>
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno">  957</span><span class="comment">   * Null if blobs pipe is disabled or not yet initialized.</span></div>
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno">  958</span><span class="comment">   *</span></div>
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno">  959</span><span class="comment">   * In addition, if 1-arg init_blob_pipe() was called, this is *also* the #Blob_receiver_obj; blob_rcv()</span></div>
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno">  960</span><span class="comment">   * `reinterpret_cast`s `*m_blob_snd` as `Blob_receiver&amp;`.  The type safety is guaranteed by how #m_blob_rcv</span></div>
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno">  961</span><span class="comment">   * is initialized in init_blob_pipe().</span></div>
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno">  962</span><span class="comment">   */</span></div>
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#afce8f777b5400d5d1cb4f811052e2158">  963</a></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a2e8f56b4542da2d66a438c4bd048236a">Blob_sender_ptr</a> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#afce8f777b5400d5d1cb4f811052e2158">m_blob_snd</a>;</div>
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno">  964</span><span class="comment"></span> </div>
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno">  965</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno">  966</span><span class="comment">   * If 2-arg init_blob_pipe() was used, this is the #Blob_sender_obj equivalent of #m_blob_snd; else null.</span></div>
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno">  967</span><span class="comment">   * Null if blobs pipe is disabled or not yet initialized.</span></div>
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno">  968</span><span class="comment">   *</span></div>
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno">  969</span><span class="comment">   * @see #m_blob_snd doc header.</span></div>
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno">  970</span><span class="comment">   */</span></div>
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#af1f8a47479c75a2daf0a37f384325168">  971</a></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a22da0e807ec4dc6c267c376d78753ed3">Blob_receiver_ptr</a> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#af1f8a47479c75a2daf0a37f384325168">m_blob_rcv</a>;</div>
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno">  972</span><span class="comment"></span> </div>
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno">  973</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno">  974</span><span class="comment">   * The #Native_handle_sender_obj (sender along the handles pipe).  Lifetime is between init_native_handle_pipe()</span></div>
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno">  975</span><span class="comment">   * and move/dtor.  Null if handles pipe is disabled or not yet initialized.</span></div>
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno">  976</span><span class="comment">   *</span></div>
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno">  977</span><span class="comment">   * In addition, if 1-arg init_native_handle_pipe() was called, this is *also* the #Native_handle_receiver_obj;</span></div>
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno">  978</span><span class="comment">   * hndl_rcv() `reinterpret_cast`s `*m_hndl_snd` as `Native_handle_receiver_obj&amp;`.  The type safety is guaranteed</span></div>
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno">  979</span><span class="comment">   * by how #m_hndl_rcv is initialized in init_native_handle_pipe().</span></div>
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno">  980</span><span class="comment">   */</span></div>
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a6e95edccbd3d3117f252300d6bcef308">  981</a></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a7fa3eda5e3488e989ca34a29976324d1">Native_handle_sender_ptr</a> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#a6e95edccbd3d3117f252300d6bcef308">m_hndl_snd</a>;</div>
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno">  982</span><span class="comment"></span> </div>
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno">  983</span><span class="comment">  /**</span></div>
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno">  984</span><span class="comment">   * If 2-arg init_native_handle_pipe() was used, this is the Native_handle_receiver_obj equivalent of #m_hndl_snd;</span></div>
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno">  985</span><span class="comment">   * else null.  Null if handles pipe is disabled or not yet initialized.</span></div>
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno">  986</span><span class="comment">   *</span></div>
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno">  987</span><span class="comment">   * @see #m_hndl_snd doc header.</span></div>
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno">  988</span><span class="comment">   */</span></div>
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#aaf3263fa795fabb3f743b14f35827f19">  989</a></span>  <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a6d0d2590651b417db4275a9252d52119">Native_handle_receiver_ptr</a> <a class="code hl_variable" href="classipc_1_1transport_1_1Channel.html#aaf3263fa795fabb3f743b14f35827f19">m_hndl_rcv</a>;</div>
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno">  990</span>}; <span class="comment">// class Channel</span></div>
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno">  991</span><span class="comment"></span> </div>
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno">  992</span><span class="comment">/**</span></div>
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno">  993</span><span class="comment"> * Dummy type for use as a template param to Channel when either the blobs pipe or handles pipe is disabled;</span></div>
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno">  994</span><span class="comment"> * as well as to mark a given peer object as not having a counterpart form: a `sync_io` object shall have</span></div>
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno">  995</span><span class="comment"> * its `using Sync_io_obj = Null_peer` and coversely for async-I/O guys and their `Async_io_obj`s.</span></div>
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno">  996</span><span class="comment"> *</span></div>
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno">  997</span><span class="comment"> * No object of this type is ever touched, at least if Channel is properly used.</span></div>
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno">  998</span><span class="comment"> */</span></div>
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Null__peer.html">  999</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Null_peer</a></div>
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span>{</div>
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span><span class="keyword">public</span>:<span class="comment"></span></div>
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span><span class="comment">  /// You may disregard.</span></div>
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Null__peer.html#af8729d5dc5fabe982fa7b11f0b78d8b1"> 1003</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Sync_io_obj</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Null_peer</a>;<span class="comment"></span></div>
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span><span class="comment">  /// You may disregard.</span></div>
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Null__peer.html#af4e6e3e13b508fd8522b0a95bb69f4d1"> 1005</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Async_io_obj</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Null_peer</a>;</div>
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span>};</div>
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span><span class="comment"></span> </div>
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span><span class="comment">/**</span></div>
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span><span class="comment"> * A Channel with a *handles pipe* only (no *blobs pipe*) that uses a Unix domain socket connection as the</span></div>
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span><span class="comment"> * underlying transport for that pipe.</span></div>
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span><span class="comment"> *</span></div>
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span><span class="comment"> * Note this is a glorified alias; it stores no additional data on top of the super-class.  It is easier to use</span></div>
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span><span class="comment"> * than the super-class, as the ctor takes care of the necessary init_native_handle_pipe() call to complete</span></div>
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span><span class="comment"> * initialization directly during construction.  You may freely `static_cast` pointers/references between</span></div>
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span><span class="comment"> * the 2 types.</span></div>
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span><span class="comment"> *</span></div>
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span><span class="comment"> *   - send_native_handle(), async_receive_native_handle() will work (over Unix domain socket stream transport).</span></div>
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"> 1018</span><span class="comment"> *   - send_blob(), async_receive_blob() will not compile.</span></div>
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span><span class="comment"> *</span></div>
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span><span class="comment"> * @tparam SIO</span></div>
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span><span class="comment"> *         Selects between `transport::sync_io::` and `transport::` version of held type(s); hence</span></div>
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span><span class="comment"> *         between Channel::S_IS_SYNC_IO_OBJ and Channel::S_IS_ASYNC_IO_OBJ.</span></div>
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span><span class="comment"> */</span></div>
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO&gt;</div>
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Socket__stream__channel.html"> 1025</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1transport_1_1Socket__stream__channel.html">Socket_stream_channel</a> :</div>
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span>  <span class="keyword">public</span> <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&lt;Null_peer, Null_peer,</div>
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span>                 std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;,</div>
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span>                 std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;&gt;</div>
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"> 1029</span>{</div>
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span><span class="comment"></span> </div>
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span><span class="comment">  /// Short-hand for our base class.</span></div>
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Socket__stream__channel.html#aa5908f07f8da3c854e7b838aed404042"> 1034</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Base</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&lt;<a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Null_peer</a>, <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Null_peer</a>,</div>
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span>                       std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;,</div>
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span>                       std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;&gt;;</div>
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span> </div>
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"> 1038</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span><span class="comment"></span> </div>
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span><span class="comment">   * Constructs the Channel in PEER state.  `sock_stm` must be in PEER state; else behavior is undefined.</span></div>
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span><span class="comment">   *</span></div>
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span><span class="comment">   *        Logger to use for logging subsequently.</span></div>
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span><span class="comment">   * @param nickname_str</span></div>
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span><span class="comment">   *        See nickname().</span></div>
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span><span class="comment">   * @param sock_stm</span></div>
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span><span class="comment">   *        The peer object that becomes owned by `*this` via move.  `sock_stm` becomes as-if default-cted</span></div>
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span><span class="comment">   *        (NULL state).</span></div>
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span><span class="comment">   */</span></div>
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel.html#ad1d5f032926c8c04b302755072274bc5">Socket_stream_channel</a>(flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> nickname_str,</div>
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span>                                 <span class="keyword">typename</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#afc600491e137c9dc16c202b04885a36a">Base::Native_handle_sender_obj</a>&amp;&amp; sock_stm);</div>
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span><span class="comment"></span> </div>
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span><span class="comment">  /// Identical to Channel default ctor.</span></div>
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Socket__stream__channel.html#ad1d5f032926c8c04b302755072274bc5"> 1055</a></span><span class="comment"></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel.html#ad1d5f032926c8c04b302755072274bc5">Socket_stream_channel</a>();</div>
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span> </div>
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span><span class="comment"></span> </div>
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span><span class="comment">   * Identical to Native_socket_stream::remote_peer_process_credentials(): OS-reported process credential</span></div>
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span><span class="comment">   * (PID, etc.) info about the *other* connected peer&#39;s process.  See its doc header.</span></div>
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span><span class="comment">   *</span></div>
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span><span class="comment">   */</span></div>
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span>  <a class="code hl_class" href="classipc_1_1util_1_1Process__credentials.html">util::Process_credentials</a> <a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel.html#acad7936d9a7db817bc46ee4fe479d838">remote_peer_process_credentials</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0) <span class="keyword">const</span>;</div>
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span>}; <span class="comment">// class Socket_stream_channel</span></div>
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span><span class="comment"></span> </div>
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span><span class="comment">/**</span></div>
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span><span class="comment"> * A Channel with a *blobs pipe* only (no *handles pipe*) that uses a Unix domain socket connection as the</span></div>
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span><span class="comment"> * underlying transport for that pipe.</span></div>
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span><span class="comment"> *   - send_blob(), async_receive_blob() will work (over Unix domain socket stream transport).</span></div>
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span><span class="comment"> *   - send_native_handle(), async_receive_native_handle() will not compile.</span></div>
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span><span class="comment"> *</span></div>
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span><span class="comment"> * One might use this instead of #Posix_mqs_socket_stream_channel</span></div>
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span><span class="comment"> * or #Bipc_mqs_channel_of_blobs or Mqs_channel if:</span></div>
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span><span class="comment"> *   - one feels it is faster or not-slower than those MQs; and/or</span></div>
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span><span class="comment"> *   - the connection setup/teardown concerns are cleaner or easier than for MQs.</span></div>
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span><span class="comment"> *     In particular, MQs have kernel persistence, and if a crash prevents a destructor from executing then</span></div>
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span><span class="comment"> *     additional cleanup is required after restart in order to free those RAM resources.</span></div>
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span><span class="comment"> *</span></div>
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span><span class="comment"> * Note this a glorified alias; it stores no additional data on top of the super-class.  It is easier to use</span></div>
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span><span class="comment"> * than the super-class, as the ctor takes care of the necessary init_blob_pipe() call to complete initialization</span></div>
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span><span class="comment"> * directly during construction.  You may freely `static_cast` pointers/references between</span></div>
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span><span class="comment"> * the 2 types.</span></div>
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span><span class="comment"> *</span></div>
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span><span class="comment"> * @tparam SIO</span></div>
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span><span class="comment"> *         Selects between `transport::sync_io::` and `transport::` version of held type(s); hence</span></div>
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span><span class="comment"> *         between Channel::S_IS_SYNC_IO_OBJ and Channel::S_IS_ASYNC_IO_OBJ.</span></div>
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span><span class="comment"> */</span></div>
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO&gt;</div>
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html"> 1093</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html">Socket_stream_channel_of_blobs</a> :</div>
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span>  <span class="keyword">public</span> <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&lt;std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;,</div>
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span>                 std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;,</div>
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span>                 Null_peer, Null_peer&gt;</div>
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span>{</div>
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span><span class="comment"></span> </div>
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span><span class="comment">  /// Short-hand for base class.</span></div>
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#ab6c060d7c300e21b2f89cc2790583fdb"> 1102</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Base</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel&lt;std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;</a>,</div>
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span>                       std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;,</div>
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span>                       <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Null_peer</a>, <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Null_peer</a>&gt;;</div>
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> </div>
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span><span class="comment"></span> </div>
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span><span class="comment">   * Constructs the Channel in PEER state.  `sock_stm` must be in PEER state; else behavior is undefined.</span></div>
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span><span class="comment">   *</span></div>
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span><span class="comment">   *        Logger to use for logging subsequently.</span></div>
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span><span class="comment">   * @param nickname_str</span></div>
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span><span class="comment">   *        See nickname().</span></div>
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span><span class="comment">   * @param sock_stm</span></div>
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span><span class="comment">   *        The peer object that becomes owned by `*this` via move.  `sock_stm` becomes as-if default-cted</span></div>
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span><span class="comment">   *        (NULL state).</span></div>
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span><span class="comment">   */</span></div>
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a6ffbd698a432e3b7f0796d589c56f57e">Socket_stream_channel_of_blobs</a>(flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> nickname_str,</div>
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span>                                          <span class="keyword">typename</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#a82746276cc7379a866b12d529780900f">Base::Blob_sender_obj</a>&amp;&amp; sock_stm);</div>
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span><span class="comment"></span> </div>
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span><span class="comment">  /// Identical to Channel default ctor.</span></div>
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a6ffbd698a432e3b7f0796d589c56f57e"> 1123</a></span><span class="comment"></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a6ffbd698a432e3b7f0796d589c56f57e">Socket_stream_channel_of_blobs</a>();</div>
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"> 1124</span> </div>
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span><span class="comment"></span> </div>
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span><span class="comment">   * Identical to Native_socket_stream::remote_peer_process_credentials(): OS-reported process credential</span></div>
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span><span class="comment">   * (PID, etc.) info about the *other* connected peer&#39;s process.  See its doc header.</span></div>
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span><span class="comment">   *</span></div>
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span><span class="comment">   * @return See above.</span></div>
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span><span class="comment">   */</span></div>
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"> 1135</span>  <a class="code hl_class" href="classipc_1_1util_1_1Process__credentials.html">util::Process_credentials</a> <a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a76c7a2ba5195bf1f6e41823b085670c9">remote_peer_process_credentials</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0) <span class="keyword">const</span>;</div>
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span>}; <span class="comment">// class Socket_stream_channel_of_blobs</span></div>
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span><span class="comment"></span> </div>
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span><span class="comment">/**</span></div>
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span><span class="comment"> * A Channel with *at least* a *blobs pipe* consisting of two MQs of type Persistent_mq_handle (template arg 1);</span></div>
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span><span class="comment"> * and *possibly* a *handles pipe* as governed by template args 2 and 3 which default to Null_peer (in which</span></div>
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span><span class="comment"> * case the handles pipe is disabled).  To use:</span></div>
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span><span class="comment"> *   - Construct, passing in the two MQ peer objects for `*this` to own.</span></div>
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span><span class="comment"> *   - If and only if you require a handles pipe as well, call init_native_handle_pipe() to complete initialization.</span></div>
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span><span class="comment"> *</span></div>
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span><span class="comment"> * As a result:</span></div>
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span><span class="comment"> *   - send_blob(), async_receive_blob() will work (over MQs).</span></div>
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span><span class="comment"> *   - If one does not call init_native_handle_pipe():</span></div>
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span><span class="comment"> *     - send_native_handle(), async_receive_native_handle() will not compile.</span></div>
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span><span class="comment"> *</span></div>
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span><span class="comment"> * However it is likely more typical to use Mqs_socket_stream_channel (which extends Mqs_channel) or even more</span></div>
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span><span class="comment"> * likely its two concrete-type aliases #Posix_mqs_socket_stream_channel, #Bipc_mqs_socket_stream_channel</span></div>
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span><span class="comment"> * (and/or sync_io::Posix_mqs_socket_stream_channel, sync_io::Bipc_mqs_socket_stream_channel).</span></div>
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span><span class="comment"> * Either way init_native_handle_pipe() is then done for the user.  If no handles pipe is required, then it is</span></div>
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span><span class="comment"> * likely one would use #Posix_mqs_channel_of_blobs or #Bipc_mqs_channel_of_blobs (aliases to Mqs_channel).</span></div>
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span><span class="comment"> *</span></div>
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span><span class="comment"> * @tparam Persistent_mq_handle</span></div>
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span><span class="comment"> *         Implements that concept.</span></div>
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span><span class="comment"> * @tparam Native_handle_sender</span></div>
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span><span class="comment"> *         Implements that concept (in `transport::` or `transport::sync_io::`)</span></div>
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span><span class="comment"> *         if handles pipe enabled; otherwise Null_peer.</span></div>
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span><span class="comment"> * @tparam Native_handle_receiver</span></div>
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span><span class="comment"> *         Analogously.</span></div>
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span><span class="comment"> *</span></div>
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"> 1164</span><span class="comment"> * @tparam SIO</span></div>
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span><span class="comment"> *         Selects between `transport::sync_io::` and `transport::` version of held type(s); hence</span></div>
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span><span class="comment"> *         between Channel::S_IS_SYNC_IO_OBJ and Channel::S_IS_ASYNC_IO_OBJ.</span></div>
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span><span class="comment"> */</span></div>
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO, <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Persistent_mq_handle</a>,</div>
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span><span class="preprocessor">#ifdef IPC_DOXYGEN_ONLY </span><span class="comment">// Mirror the transport_fwd.hpp fwd-declaration in the generated docs.</span></div>
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span>         <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__sender.html">Native_handle_sender</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Null_peer</a>, <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__receiver.html">Native_handle_receiver</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Null__peer.html">Null_peer</a>&gt;</div>
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span>         <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__sender.html">Native_handle_sender</a>, <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__receiver.html">Native_handle_receiver</a>&gt;</div>
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__channel.html"> 1174</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1transport_1_1Mqs__channel.html">Mqs_channel</a> :</div>
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span>  <span class="keyword">public</span> <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&lt;std::conditional_t&lt;SIO, sync_io::Blob_stream_mq_sender&lt;Persistent_mq_handle&gt;,</div>
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span>                                         Blob_stream_mq_sender&lt;Persistent_mq_handle&gt;&gt;,</div>
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"> 1177</span>                 std::conditional_t&lt;SIO, sync_io::Blob_stream_mq_receiver&lt;Persistent_mq_handle&gt;,</div>
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span>                                         Blob_stream_mq_receiver&lt;Persistent_mq_handle&gt;&gt;,</div>
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span>                 Native_handle_sender, Native_handle_receiver&gt;</div>
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span>{</div>
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span><span class="comment"></span> </div>
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span><span class="comment">  /// Short-hand for the Persistent_mq_handle concrete type used for blobs pipe.</span></div>
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__channel.html#a1dd9cae78d93d16984072711d57ba696"> 1185</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Mq</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Persistent_mq_handle</a>;</div>
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span><span class="comment"></span> </div>
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span><span class="comment">  /// Short-hand for base class.</span></div>
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__channel.html#abcd00571d161aa2f0dc8738fa9a451ff"> 1188</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Base</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel&lt;std::conditional_t&lt;SIO, sync_io::Blob_stream_mq_sender&lt;Persistent_mq_handle&gt;</a>,</div>
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"> 1189</span>                                               <a class="code hl_class" href="classipc_1_1transport_1_1Blob__stream__mq__sender.html">Blob_stream_mq_sender&lt;Persistent_mq_handle&gt;</a>&gt;,</div>
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span>                       std::conditional_t&lt;SIO, sync_io::Blob_stream_mq_receiver&lt;Persistent_mq_handle&gt;,</div>
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span>                                               <a class="code hl_class" href="classipc_1_1transport_1_1Blob__stream__mq__receiver.html">Blob_stream_mq_receiver&lt;Persistent_mq_handle&gt;</a>&gt;,</div>
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span>                       <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__sender.html">Native_handle_sender</a>, <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__receiver.html">Native_handle_receiver</a>&gt;;</div>
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span> </div>
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span><span class="comment"></span> </div>
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span><span class="comment">   * Constructs the Channel in PEER state.</span></div>
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"> 1198</span><span class="comment">   * `mq_out` and `mq_in` must be suitable for Persistent_mq_handle PEER-state ctor (see it doc header); else</span></div>
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span><span class="comment">   * behavior is undefined.</span></div>
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span><span class="comment">   *</span></div>
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span><span class="comment">   * If and only if you intend to equip `*this` with a *handles pipe* as well, you must call init_native_handle_pipe()</span></div>
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span><span class="comment">   * to complete initialization.</span></div>
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span><span class="comment">   *</span></div>
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span><span class="comment">   * ### Error semantics ###</span></div>
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span><span class="comment">   * While the below formally outlines how it all works, informally using this is pretty simple:</span></div>
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span><span class="comment">   *   - If you choose the throwing form (null `err_code`),</span></div>
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span><span class="comment">   *     then by the nature of C++ `*this` cannot exist &lt;=&gt; this throws.</span></div>
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span><span class="comment">   *   - If you choose the non-throwing form (non-null `err_code`),</span></div>
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span><span class="comment">   *     then a truthy `*err_code` &lt;=&gt; `*this` is unusable (except to move-to).</span></div>
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"> 1210</span><span class="comment">   *   - Any error is logged.</span></div>
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span><span class="comment">   *</span></div>
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span><span class="comment">   * Formally though:</span></div>
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span><span class="comment">   *</span></div>
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span><span class="comment">   * Firstly: See `flow::Error_code` docs for error reporting semantics (including the exception/code dichotomy).</span></div>
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span><span class="comment">   * The bottom line is: If `err_code` is null, then success &lt;=&gt; this ctor does not throw.</span></div>
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span><span class="comment">   * If `err_code` is non-null, then success &lt;=&gt; `*err_code` is falsy after return.  If it is truthy,</span></div>
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span><span class="comment">   * the `*this` shall not be used except to invoke destructor or to be moved-to.  Otherwise behavior is undefined.</span></div>
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span><span class="comment">   *</span></div>
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span><span class="comment">   * Secondly: The source of error conditions is explicitly the following:</span></div>
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span><span class="comment">   *   - `Blob_stream_mq_sender&lt;Mq&gt;(logger_ptr, nickname_str, std::move(mq_out), err_code)` may emit an error.</span></div>
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span><span class="comment">   *   - `Blob_stream_mq_receiver&lt;Mq&gt;(logger_ptr, nickname_str, std::move(mq_in), err_code)` may emit an error.</span></div>
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"> 1222</span><span class="comment">   *   - These are invoked in that order; and if the first fails then the second is not invoked.</span></div>
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span><span class="comment">   *</span></div>
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span><span class="comment">   * Hence the eventualities are as follows:</span></div>
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span><span class="comment">   *   - If neither fails: This ctor will neither throw nor emit a truthy `*err_code`.  Yay!</span></div>
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span><span class="comment">   *   - If one fails: This ctor shall either throw or emit the truthy `*err_code` associated with the one that</span></div>
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span><span class="comment">   *     did fail.  (You cannot know which.  Sorry.)  Just give up on `*this` (though technically it can</span></div>
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span><span class="comment">   *     still be moved-to).</span></div>
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span><span class="comment">   *   - Both cannot fail due to the algorithm outlined above.</span></div>
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span><span class="comment">   *</span></div>
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span><span class="comment">   *        Logger to use for logging subsequently.</span></div>
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span><span class="comment">   * @param nickname_str</span></div>
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"> 1234</span><span class="comment">   *        See nickname().</span></div>
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span><span class="comment">   * @param mq_out</span></div>
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span><span class="comment">   *        Open handle to the underlying MQ for traffic *from* `*this` *to* opposing peer.</span></div>
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span><span class="comment">   *        The peer object becomes owned by `*this` via move.  `mq_out` becomes unusable for transmission.</span></div>
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span><span class="comment">   * @param mq_in</span></div>
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span><span class="comment">   *        Open handle to the underlying MQ for traffic *to* `*this` *from* opposing peer.</span></div>
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span><span class="comment">   *        The peer object becomes owned by `*this` via move.  `mq_in` becomes unusable for transmission.</span></div>
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span><span class="comment">   */</span></div>
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__channel.html#a3d51b0a0be20d9c3ce93b239290ea188"> 1244</a></span>  <span class="keyword">explicit</span> <a class="code hl_function" href="classipc_1_1transport_1_1Mqs__channel.html#a3d51b0a0be20d9c3ce93b239290ea188">Mqs_channel</a>(flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> nickname_str,</div>
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span>                       <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Mq</a>&amp;&amp; mq_out, <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Mq</a>&amp;&amp; mq_in, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0);</div>
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"> 1246</span><span class="comment"></span> </div>
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span><span class="comment">  /// Identical to Channel default ctor.</span></div>
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__channel.html#af829b5841e1bc1c23f254bc344b147ab"> 1248</a></span><span class="comment"></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Mqs__channel.html#af829b5841e1bc1c23f254bc344b147ab">Mqs_channel</a>();</div>
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span>}; <span class="comment">// class Mqs_channel</span></div>
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span><span class="comment"></span> </div>
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span><span class="comment">/**</span></div>
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span><span class="comment"> * A Channel with a *blobs pipe* consisting of 2 MQs of type Persistent_mq_handle (template arg); and</span></div>
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span><span class="comment"> * a *handles pipe* over a Unix domain socket connection.  See also the 2 aliases</span></div>
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span><span class="comment"> * #Posix_mqs_socket_stream_channel and #Bipc_mqs_socket_stream_channel (also in transport::sync_io).</span></div>
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span><span class="comment"> *   - send_blob(), async_receive_blob() will work (over MQs).</span></div>
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"> 1256</span><span class="comment"> *   - send_native_handle(), async_receive_native_handle() will work (over Unix domain socket stream transport).</span></div>
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span><span class="comment"> *</span></div>
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span><span class="comment"> * In practice this is the most full-featured Channel available as of this writing.  The competition would be</span></div>
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span><span class="comment"> * Socket_stream_channel which uses a single Unix domain socket connection: It features only one full-duplex pipe,</span></div>
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span><span class="comment"> * but since a Native_handle_sender::send_native_handle() (and conversely</span></div>
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"> 1261</span><span class="comment"> * Native_handle_receiver::async_receive_native_handle()) supports sending a blob without any accompanying</span></div>
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span><span class="comment"> * #Native_handle, it should not be necessary to bundle 2 underlying full-duplex pipes; one suffices and uses fewer</span></div>
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span><span class="comment"> * resources and features less complexity.</span></div>
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span><span class="comment"> *</span></div>
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span><span class="comment"> * @tparam Persistent_mq_handle</span></div>
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span><span class="comment"> *         Implements that concept.</span></div>
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span><span class="comment"> *</span></div>
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span><span class="comment"> * @tparam SIO</span></div>
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span><span class="comment"> *         Selects between `transport::sync_io::` and `transport::` version of held type(s); hence</span></div>
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span><span class="comment"> *         between Channel::S_IS_SYNC_IO_OBJ and Channel::S_IS_ASYNC_IO_OBJ.</span></div>
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"> 1271</span><span class="comment"> */</span></div>
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO, <span class="keyword">typename</span> Persistent_mq_handle&gt;</div>
<div class="line"><a id="l01273" name="l01273"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html"> 1273</a></span><span class="keyword">class </span><a class="code hl_class" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html">Mqs_socket_stream_channel</a> :</div>
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span>  <span class="keyword">public</span> <a class="code hl_class" href="classipc_1_1transport_1_1Mqs__channel.html">Mqs_channel</a>&lt;SIO,</div>
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span>                     Persistent_mq_handle,</div>
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"> 1276</span>                     std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;,</div>
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span>                     std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;&gt;</div>
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span>{</div>
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span>  <span class="comment">// Types.</span></div>
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span><span class="comment"></span> </div>
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"> 1282</span><span class="comment">  /// Short-hand for the Persistent_mq_handle concrete type used for blobs pipe.</span></div>
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#ab241c77d146639471f6b53209fac16c9"> 1283</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Mq</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Persistent_mq_handle</a>;</div>
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span><span class="comment"></span> </div>
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"> 1285</span><span class="comment">  /// Short-hand for base class.</span></div>
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#a31fa15aabde0fc6b77929577973ca00b"> 1286</a></span><span class="comment"></span>  <span class="keyword">using </span><a class="code hl_class" href="classipc_1_1transport_1_1Mqs__channel.html">Base</a> = <a class="code hl_class" href="classipc_1_1transport_1_1Mqs__channel.html">Mqs_channel</a>&lt;SIO,</div>
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span>                           <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Persistent_mq_handle</a>,</div>
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span>                           std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;,</div>
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span>                           std::conditional_t&lt;SIO, sync_io::Native_socket_stream, Native_socket_stream&gt;&gt;;</div>
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span> </div>
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span>  <span class="comment">// Constructors/destructor.</span></div>
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span><span class="comment"></span> </div>
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span><span class="comment">   * Constructs the Channel in PEER state.  `sock_stm` must be in PEER state; else behavior is undefined.</span></div>
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span><span class="comment">   * `mq_out` and `mq_in` must be suitable for Persistent_mq_handle PEER-state ctor (see it doc header); else</span></div>
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span><span class="comment">   * behavior is undefined.</span></div>
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span><span class="comment">   *</span></div>
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span><span class="comment">   * ### Error semantics ###</span></div>
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span><span class="comment">   * See Mqs_channel() ctor doc header.  The only source of error conditions is still MQs;</span></div>
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span><span class="comment">   * `sock_stm` is simply moved-from as-is.</span></div>
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span><span class="comment">   *</span></div>
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span><span class="comment">   * @param logger_ptr</span></div>
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span><span class="comment">   *        Logger to use for logging subsequently.</span></div>
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span><span class="comment">   * @param nickname_str</span></div>
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span><span class="comment">   *        See nickname().</span></div>
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span><span class="comment">   * @param mq_out</span></div>
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span><span class="comment">   *        Open handle to the underlying MQ for traffic *from* `*this` *to* opposing peer.</span></div>
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"> 1308</span><span class="comment">   *        The peer object becomes owned by `*this` via move.  `mq_out` becomes unusable for transmission.</span></div>
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span><span class="comment">   * @param mq_in</span></div>
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span><span class="comment">   *        Open handle to the underlying MQ for traffic *to* `*this` *from* opposing peer.</span></div>
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span><span class="comment">   *        The peer object becomes owned by `*this` via move.  `mq_in` becomes unusable for transmission.</span></div>
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span><span class="comment">   * @param sock_stm</span></div>
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"> 1313</span><span class="comment">   *        The peer object becomes owned by `*this` via move.  `sock_stm` becomes as-if default-cted</span></div>
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span><span class="comment">   *        (NULL state).</span></div>
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span><span class="comment">   */</span></div>
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span>  <span class="keyword">explicit</span> <a class="code hl_function" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#afb4920318fdcb1070f13a6dc3be07452">Mqs_socket_stream_channel</a>(flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> nickname_str,</div>
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span>                                     <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Mq</a>&amp;&amp; mq_out, <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Mq</a>&amp;&amp; mq_in,</div>
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span>                                     <span class="keyword">typename</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#afc600491e137c9dc16c202b04885a36a">Base::Base::Native_handle_sender_obj</a>&amp;&amp; sock_stm,</div>
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span>                                     <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0);</div>
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span><span class="comment"></span> </div>
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span><span class="comment">  /// Identical to Channel default ctor.</span></div>
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#afb4920318fdcb1070f13a6dc3be07452"> 1324</a></span><span class="comment"></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#afb4920318fdcb1070f13a6dc3be07452">Mqs_socket_stream_channel</a>();</div>
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span> </div>
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span>  <span class="comment">// Methods.</span></div>
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span><span class="comment"></span> </div>
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"> 1328</span><span class="comment">  /**</span></div>
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span><span class="comment">   * Identical to Native_socket_stream::remote_peer_process_credentials(): OS-reported process credential</span></div>
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"> 1330</span><span class="comment">   * (PID, etc.) info about the *other* connected peer&#39;s process.  See its doc header.</span></div>
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span><span class="comment">   *</span></div>
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span><span class="comment">   * @param err_code</span></div>
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span><span class="comment">   *        See above.</span></div>
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span><span class="comment">   * @return See above.  If `*this` is as-if-default-cted then returns default-cted value.</span></div>
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span><span class="comment">   */</span></div>
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"> 1336</span>  <a class="code hl_class" href="classipc_1_1util_1_1Process__credentials.html">util::Process_credentials</a> <a class="code hl_function" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#a9a7aae94a79b9545e0870a6b958171ec">remote_peer_process_credentials</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code = 0) <span class="keyword">const</span>;</div>
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span>}; <span class="comment">// class Mqs_socket_stream_channel</span></div>
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span> </div>
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span><span class="comment">// Free functions: in *_fwd.hpp.</span></div>
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span> </div>
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span><span class="comment">// Channel template implementations.</span></div>
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span><span class="comment"></span> </div>
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"> 1343</span><span class="comment">/// Internally used macro; public API users should disregard (same deal as in struc/channel.hpp).</span></div>
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"><a class="line" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1"> 1344</a></span><span class="comment"></span><span class="preprocessor">#define TEMPLATE_CHANNEL \</span></div>
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span><span class="preprocessor">  template&lt;typename Blob_sender, typename Blob_receiver, typename Native_handle_sender, typename Native_handle_receiver&gt;</span><span class="comment"></span></div>
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"> 1346</span><span class="comment">/// Internally used macro; public API users should disregard (same deal as in struc/channel.hpp).</span></div>
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"><a class="line" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#aa498064773ba3aad9a5828df463739a7"> 1347</a></span><span class="comment"></span><span class="preprocessor">#define CLASS_CHANNEL \</span></div>
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"> 1348</span><span class="preprocessor">  Channel&lt;Blob_sender, Blob_receiver, Native_handle_sender, Native_handle_receiver&gt;</span></div>
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span> </div>
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"> 1350</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01351" name="l01351"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ae7f2b8a45af59c073fa91f74be0439d8"> 1351</a></span><a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#ac543b500a85f556564e592cbbefb6185">CLASS_CHANNEL::Channel</a>() :</div>
<div class="line"><a id="l01352" name="l01352"></a><span class="lineno"> 1352</span>  <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>(nullptr, <span class="stringliteral">&quot;&quot;</span>)</div>
<div class="line"><a id="l01353" name="l01353"></a><span class="lineno"> 1353</span>{</div>
<div class="line"><a id="l01354" name="l01354"></a><span class="lineno"> 1354</span>  <span class="comment">// Cool.</span></div>
<div class="line"><a id="l01355" name="l01355"></a><span class="lineno"> 1355</span>}</div>
<div class="line"><a id="l01356" name="l01356"></a><span class="lineno"> 1356</span> </div>
<div class="line"><a id="l01357" name="l01357"></a><span class="lineno"> 1357</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01358" name="l01358"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ab961f45ec4416bfa010df7b9a6e4f40a"> 1358</a></span><a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#ac543b500a85f556564e592cbbefb6185">CLASS_CHANNEL::Channel</a>(flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> nickname_str) :</div>
<div class="line"><a id="l01359" name="l01359"></a><span class="lineno"> 1359</span>  flow::log::Log_context(logger_ptr, <a class="code hl_enumeration" href="namespaceipc.html#a4ccdeed058222c635745a4dc830e99f7">Log_component</a>::S_TRANSPORT),</div>
<div class="line"><a id="l01360" name="l01360"></a><span class="lineno"> 1360</span>  m_nickname(nickname_str)</div>
<div class="line"><a id="l01361" name="l01361"></a><span class="lineno"> 1361</span>{</div>
<div class="line"><a id="l01362" name="l01362"></a><span class="lineno"> 1362</span>  FLOW_LOG_INFO(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Created (no pipes bundled yet).&quot;</span>);</div>
<div class="line"><a id="l01363" name="l01363"></a><span class="lineno"> 1363</span> </div>
<div class="line"><a id="l01364" name="l01364"></a><span class="lineno"> 1364</span>  <span class="comment">// Now they must call init_*_pipe() for any desired pipes they want to bundle in *this Channel.</span></div>
<div class="line"><a id="l01365" name="l01365"></a><span class="lineno"> 1365</span>}</div>
<div class="line"><a id="l01366" name="l01366"></a><span class="lineno"> 1366</span> </div>
<div class="line"><a id="l01367" name="l01367"></a><span class="lineno"> 1367</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01368" name="l01368"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#add016cbac936d3da6c861755ac88b7a2"> 1368</a></span><span class="keyword">typename</span> CLASS_CHANNEL::Async_io_obj CLASS_CHANNEL::async_io_obj()</div>
<div class="line"><a id="l01369" name="l01369"></a><span class="lineno"> 1369</span>{</div>
<div class="line"><a id="l01370" name="l01370"></a><span class="lineno"> 1370</span>  <span class="keyword">static_assert</span>(S_IS_SYNC_IO_OBJ, <span class="stringliteral">&quot;Cannot make an async-I/O object from an async-I/O object... just use move ctor.&quot;</span>);</div>
<div class="line"><a id="l01371" name="l01371"></a><span class="lineno"> 1371</span> </div>
<div class="line"><a id="l01372" name="l01372"></a><span class="lineno"> 1372</span>  assert(initialized()</div>
<div class="line"><a id="l01373" name="l01373"></a><span class="lineno"> 1373</span>         &amp;&amp; <span class="stringliteral">&quot;The adopted core *this must be initialized already.  It would actually be possible to be half-initialized &quot;</span></div>
<div class="line"><a id="l01374" name="l01374"></a><span class="lineno"> 1374</span>            <span class="stringliteral">&quot;and initialize the remaining pipe(s) via init_*(), but for the time being we are outlawing it &quot;</span></div>
<div class="line"><a id="l01375" name="l01375"></a><span class="lineno"> 1375</span>            <span class="stringliteral">&quot;out of an abundance of feelings of anti-entropy.&quot;</span>);</div>
<div class="line"><a id="l01376" name="l01376"></a><span class="lineno"> 1376</span> </div>
<div class="line"><a id="l01377" name="l01377"></a><span class="lineno"> 1377</span>  <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Async_io_obj</a> target(get_logger(), nickname());</div>
<div class="line"><a id="l01378" name="l01378"></a><span class="lineno"> 1378</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_BLOB_PIPE)</div>
<div class="line"><a id="l01379" name="l01379"></a><span class="lineno"> 1379</span>  {</div>
<div class="line"><a id="l01380" name="l01380"></a><span class="lineno"> 1380</span>    <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(std::is_same_v&lt;Blob_sender_obj, Blob_receiver_obj&gt;)</div>
<div class="line"><a id="l01381" name="l01381"></a><span class="lineno"> 1381</span>    {</div>
<div class="line"><a id="l01382" name="l01382"></a><span class="lineno"> 1382</span>      target.<a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#aa8209a5adde4e5c2b3b1d8779fab0433">init_blob_pipe</a>(<span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Blob__sender.html">Async_io_obj::Blob_sender_obj</a>(std::move(*(blob_snd()))));</div>
<div class="line"><a id="l01383" name="l01383"></a><span class="lineno"> 1383</span>    }</div>
<div class="line"><a id="l01384" name="l01384"></a><span class="lineno"> 1384</span>    <span class="keywordflow">else</span></div>
<div class="line"><a id="l01385" name="l01385"></a><span class="lineno"> 1385</span>    {</div>
<div class="line"><a id="l01386" name="l01386"></a><span class="lineno"> 1386</span>      target.<a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#aa8209a5adde4e5c2b3b1d8779fab0433">init_blob_pipe</a>(<span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Blob__sender.html">Async_io_obj::Blob_sender_obj</a>(std::move(*(blob_snd()))),</div>
<div class="line"><a id="l01387" name="l01387"></a><span class="lineno"> 1387</span>                            <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Blob__receiver.html">Async_io_obj::Blob_receiver_obj</a>(std::move(*(blob_rcv()))));</div>
<div class="line"><a id="l01388" name="l01388"></a><span class="lineno"> 1388</span>    }</div>
<div class="line"><a id="l01389" name="l01389"></a><span class="lineno"> 1389</span>  }</div>
<div class="line"><a id="l01390" name="l01390"></a><span class="lineno"> 1390</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_NATIVE_HANDLE_PIPE)</div>
<div class="line"><a id="l01391" name="l01391"></a><span class="lineno"> 1391</span>  {</div>
<div class="line"><a id="l01392" name="l01392"></a><span class="lineno"> 1392</span>    <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(std::is_same_v&lt;Native_handle_sender_obj, Native_handle_receiver_obj&gt;)</div>
<div class="line"><a id="l01393" name="l01393"></a><span class="lineno"> 1393</span>    {</div>
<div class="line"><a id="l01394" name="l01394"></a><span class="lineno"> 1394</span>      target.<a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a0e0e396759dab8c0930594eac3bb03ba">init_native_handle_pipe</a>(<span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__sender.html">Async_io_obj::Native_handle_sender_obj</a>(std::move(*(hndl_snd()))));</div>
<div class="line"><a id="l01395" name="l01395"></a><span class="lineno"> 1395</span>    }</div>
<div class="line"><a id="l01396" name="l01396"></a><span class="lineno"> 1396</span>    <span class="keywordflow">else</span></div>
<div class="line"><a id="l01397" name="l01397"></a><span class="lineno"> 1397</span>    {</div>
<div class="line"><a id="l01398" name="l01398"></a><span class="lineno"> 1398</span>      target.<a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a0e0e396759dab8c0930594eac3bb03ba">init_native_handle_pipe</a>(<span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__sender.html">Async_io_obj::Native_handle_sender_obj</a>(std::move(*(hndl_snd()))),</div>
<div class="line"><a id="l01399" name="l01399"></a><span class="lineno"> 1399</span>                                     <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__receiver.html">Async_io_obj::Native_handle_receiver_obj</a>(std::move(*(hndl_rcv()))));</div>
<div class="line"><a id="l01400" name="l01400"></a><span class="lineno"> 1400</span>    }</div>
<div class="line"><a id="l01401" name="l01401"></a><span class="lineno"> 1401</span>  }</div>
<div class="line"><a id="l01402" name="l01402"></a><span class="lineno"> 1402</span> </div>
<div class="line"><a id="l01403" name="l01403"></a><span class="lineno"> 1403</span>  FLOW_LOG_INFO(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; target &lt;&lt; <span class="stringliteral">&quot;]: Created from sync_io::Channel core.&quot;</span>);</div>
<div class="line"><a id="l01404" name="l01404"></a><span class="lineno"> 1404</span> </div>
<div class="line"><a id="l01405" name="l01405"></a><span class="lineno"> 1405</span>  <span class="comment">// As promised: *this becomes as-if default-cted.  So this will reset Logger and nickname too.</span></div>
<div class="line"><a id="l01406" name="l01406"></a><span class="lineno"> 1406</span>  *<span class="keyword">this</span> = <a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#ac543b500a85f556564e592cbbefb6185">Channel</a>();</div>
<div class="line"><a id="l01407" name="l01407"></a><span class="lineno"> 1407</span> </div>
<div class="line"><a id="l01408" name="l01408"></a><span class="lineno"> 1408</span>  assert(target.<a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a43c79955b3ad0eab347550b4263523ec">initialized</a>());</div>
<div class="line"><a id="l01409" name="l01409"></a><span class="lineno"> 1409</span> </div>
<div class="line"><a id="l01410" name="l01410"></a><span class="lineno"> 1410</span>  <span class="keywordflow">return</span> target;</div>
<div class="line"><a id="l01411" name="l01411"></a><span class="lineno"> 1411</span>} <span class="comment">// Channel::async_io_obj()</span></div>
<div class="line"><a id="l01412" name="l01412"></a><span class="lineno"> 1412</span> </div>
<div class="line"><a id="l01413" name="l01413"></a><span class="lineno"> 1413</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01414" name="l01414"></a><span class="lineno"> 1414</span><a class="code hl_typedef" href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#ac543b500a85f556564e592cbbefb6185">CLASS_CHANNEL::Channel</a>(<a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l01415" name="l01415"></a><span class="lineno"> 1415</span> </div>
<div class="line"><a id="l01416" name="l01416"></a><span class="lineno"> 1416</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01417" name="l01417"></a><span class="lineno"> 1417</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#aa498064773ba3aad9a5828df463739a7">CLASS_CHANNEL</a>&amp; CLASS_CHANNEL::operator=(<a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>&amp;&amp;) = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l01418" name="l01418"></a><span class="lineno"> 1418</span> </div>
<div class="line"><a id="l01419" name="l01419"></a><span class="lineno"> 1419</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01420" name="l01420"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a10d97e67296614195f8b14599944dd65"> 1420</a></span>CLASS_CHANNEL::~Channel()</div>
<div class="line"><a id="l01421" name="l01421"></a><span class="lineno"> 1421</span>{</div>
<div class="line"><a id="l01422" name="l01422"></a><span class="lineno"> 1422</span>  FLOW_LOG_INFO(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Deleting.  Component pipe peers (if any) shall now shut down.&quot;</span>);</div>
<div class="line"><a id="l01423" name="l01423"></a><span class="lineno"> 1423</span>}</div>
<div class="line"><a id="l01424" name="l01424"></a><span class="lineno"> 1424</span> </div>
<div class="line"><a id="l01425" name="l01425"></a><span class="lineno"> 1425</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01426" name="l01426"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#aa8209a5adde4e5c2b3b1d8779fab0433"> 1426</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::init_blob_pipe(<a class="code hl_class" href="classipc_1_1transport_1_1Blob__sender.html">Blob_sender_obj</a>&amp;&amp; snd_and_rcv)</div>
<div class="line"><a id="l01427" name="l01427"></a><span class="lineno"> 1427</span>{</div>
<div class="line"><a id="l01428" name="l01428"></a><span class="lineno"> 1428</span>  <span class="keyword">static_assert</span>(S_HAS_BLOB_PIPE,</div>
<div class="line"><a id="l01429" name="l01429"></a><span class="lineno"> 1429</span>                <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01430" name="l01430"></a><span class="lineno"> 1430</span>  <span class="keyword">static_assert</span>(std::is_same_v&lt;Blob_sender_obj, Blob_receiver_obj&gt;,</div>
<div class="line"><a id="l01431" name="l01431"></a><span class="lineno"> 1431</span>                <span class="stringliteral">&quot;Compilable only if 1 object can do both directions.&quot;</span>);</div>
<div class="line"><a id="l01432" name="l01432"></a><span class="lineno"> 1432</span> </div>
<div class="line"><a id="l01433" name="l01433"></a><span class="lineno"> 1433</span>  <span class="keywordflow">if</span> (m_blob_snd || m_blob_rcv)</div>
<div class="line"><a id="l01434" name="l01434"></a><span class="lineno"> 1434</span>  {</div>
<div class="line"><a id="l01435" name="l01435"></a><span class="lineno"> 1435</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: init_blob_pipe() succeeded before yet was called again.  Ignoring.&quot;</span>);</div>
<div class="line"><a id="l01436" name="l01436"></a><span class="lineno"> 1436</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01437" name="l01437"></a><span class="lineno"> 1437</span>  }</div>
<div class="line"><a id="l01438" name="l01438"></a><span class="lineno"> 1438</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01439" name="l01439"></a><span class="lineno"> 1439</span> </div>
<div class="line"><a id="l01440" name="l01440"></a><span class="lineno"> 1440</span>  m_blob_snd.emplace(std::move(snd_and_rcv));</div>
<div class="line"><a id="l01441" name="l01441"></a><span class="lineno"> 1441</span>  <span class="comment">// m_blob_rcv remains null.  Hence blob_rcv() knows to reinterpret_cast&lt;Blob_receiver_obj&amp;&gt;(*m_blob_snd).</span></div>
<div class="line"><a id="l01442" name="l01442"></a><span class="lineno"> 1442</span> </div>
<div class="line"><a id="l01443" name="l01443"></a><span class="lineno"> 1443</span>  FLOW_LOG_INFO(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Added blob pipe with common sender/receiver (details to the left here).&quot;</span>);</div>
<div class="line"><a id="l01444" name="l01444"></a><span class="lineno"> 1444</span> </div>
<div class="line"><a id="l01445" name="l01445"></a><span class="lineno"> 1445</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01446" name="l01446"></a><span class="lineno"> 1446</span>} <span class="comment">// Channel::init_blob_pipe()</span></div>
<div class="line"><a id="l01447" name="l01447"></a><span class="lineno"> 1447</span> </div>
<div class="line"><a id="l01448" name="l01448"></a><span class="lineno"> 1448</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01449" name="l01449"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#abc969fa7785f5acda19a0c08bfeeb7e9"> 1449</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::init_blob_pipe(<a class="code hl_class" href="classipc_1_1transport_1_1Blob__sender.html">Blob_sender_obj</a>&amp;&amp; snd, <a class="code hl_class" href="classipc_1_1transport_1_1Blob__receiver.html">Blob_receiver_obj</a>&amp;&amp; rcv)</div>
<div class="line"><a id="l01450" name="l01450"></a><span class="lineno"> 1450</span>{</div>
<div class="line"><a id="l01451" name="l01451"></a><span class="lineno"> 1451</span>  <span class="keyword">static_assert</span>(S_HAS_BLOB_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01452" name="l01452"></a><span class="lineno"> 1452</span>  <span class="keyword">static_assert</span>(!std::is_same_v&lt;Blob_sender_obj, Blob_receiver_obj&gt;,</div>
<div class="line"><a id="l01453" name="l01453"></a><span class="lineno"> 1453</span>                <span class="stringliteral">&quot;Compilable only if each object does a direction.&quot;</span>);</div>
<div class="line"><a id="l01454" name="l01454"></a><span class="lineno"> 1454</span> </div>
<div class="line"><a id="l01455" name="l01455"></a><span class="lineno"> 1455</span>  m_blob_snd.emplace(std::move(snd));</div>
<div class="line"><a id="l01456" name="l01456"></a><span class="lineno"> 1456</span>  m_blob_rcv.emplace(std::move(rcv));</div>
<div class="line"><a id="l01457" name="l01457"></a><span class="lineno"> 1457</span> </div>
<div class="line"><a id="l01458" name="l01458"></a><span class="lineno"> 1458</span>  FLOW_LOG_INFO(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Added blob pipe with separate sender/receiver (details to the left here).&quot;</span>);</div>
<div class="line"><a id="l01459" name="l01459"></a><span class="lineno"> 1459</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01460" name="l01460"></a><span class="lineno"> 1460</span>} <span class="comment">// Channel::init_blob_pipe()</span></div>
<div class="line"><a id="l01461" name="l01461"></a><span class="lineno"> 1461</span> </div>
<div class="line"><a id="l01462" name="l01462"></a><span class="lineno"> 1462</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01463" name="l01463"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a0e0e396759dab8c0930594eac3bb03ba"> 1463</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::init_native_handle_pipe(<a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__sender.html">Native_handle_sender_obj</a>&amp;&amp; snd_and_rcv)</div>
<div class="line"><a id="l01464" name="l01464"></a><span class="lineno"> 1464</span>{</div>
<div class="line"><a id="l01465" name="l01465"></a><span class="lineno"> 1465</span>  <span class="keyword">static_assert</span>(S_HAS_NATIVE_HANDLE_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01466" name="l01466"></a><span class="lineno"> 1466</span>  <span class="keyword">static_assert</span>(std::is_same_v&lt;Native_handle_sender_obj, Native_handle_receiver_obj&gt;,</div>
<div class="line"><a id="l01467" name="l01467"></a><span class="lineno"> 1467</span>                <span class="stringliteral">&quot;Compilable only if 1 object can do both directions.&quot;</span>);</div>
<div class="line"><a id="l01468" name="l01468"></a><span class="lineno"> 1468</span> </div>
<div class="line"><a id="l01469" name="l01469"></a><span class="lineno"> 1469</span>  <span class="keywordflow">if</span> (m_hndl_snd || m_hndl_rcv)</div>
<div class="line"><a id="l01470" name="l01470"></a><span class="lineno"> 1470</span>  {</div>
<div class="line"><a id="l01471" name="l01471"></a><span class="lineno"> 1471</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: &quot;</span></div>
<div class="line"><a id="l01472" name="l01472"></a><span class="lineno"> 1472</span>                     <span class="stringliteral">&quot;init_native_handle_pipe() succeeded before yet was called again.  Ignoring.&quot;</span>);</div>
<div class="line"><a id="l01473" name="l01473"></a><span class="lineno"> 1473</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01474" name="l01474"></a><span class="lineno"> 1474</span>  }</div>
<div class="line"><a id="l01475" name="l01475"></a><span class="lineno"> 1475</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01476" name="l01476"></a><span class="lineno"> 1476</span> </div>
<div class="line"><a id="l01477" name="l01477"></a><span class="lineno"> 1477</span>  m_hndl_snd.emplace(std::move(snd_and_rcv));</div>
<div class="line"><a id="l01478" name="l01478"></a><span class="lineno"> 1478</span>  <span class="comment">// m_hndl_rcv remains null.  Hence hndl_rcv() knows to reinterpret_cast&lt;Native_handle_receiver_obj&amp;&gt;(*m_hndl_snd).</span></div>
<div class="line"><a id="l01479" name="l01479"></a><span class="lineno"> 1479</span> </div>
<div class="line"><a id="l01480" name="l01480"></a><span class="lineno"> 1480</span>  FLOW_LOG_INFO(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Added handle pipe with common sender/receiver (details to the left here).&quot;</span>);</div>
<div class="line"><a id="l01481" name="l01481"></a><span class="lineno"> 1481</span> </div>
<div class="line"><a id="l01482" name="l01482"></a><span class="lineno"> 1482</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01483" name="l01483"></a><span class="lineno"> 1483</span>} <span class="comment">// Channel::init_native_handle_pipe()</span></div>
<div class="line"><a id="l01484" name="l01484"></a><span class="lineno"> 1484</span> </div>
<div class="line"><a id="l01485" name="l01485"></a><span class="lineno"> 1485</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01486" name="l01486"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#afa221b9b60aa9de1aa8dfcb0c1cabec1"> 1486</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::init_native_handle_pipe(<a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__sender.html">Native_handle_sender_obj</a>&amp;&amp; snd, <a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__receiver.html">Native_handle_receiver_obj</a>&amp;&amp; rcv)</div>
<div class="line"><a id="l01487" name="l01487"></a><span class="lineno"> 1487</span>{</div>
<div class="line"><a id="l01488" name="l01488"></a><span class="lineno"> 1488</span>  <span class="keyword">static_assert</span>(S_HAS_NATIVE_HANDLE_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01489" name="l01489"></a><span class="lineno"> 1489</span>  <span class="keyword">static_assert</span>(!std::is_same_v&lt;Native_handle_sender_obj, Native_handle_receiver_obj&gt;,</div>
<div class="line"><a id="l01490" name="l01490"></a><span class="lineno"> 1490</span>                <span class="stringliteral">&quot;Compilable only if each object does a direction.&quot;</span>);</div>
<div class="line"><a id="l01491" name="l01491"></a><span class="lineno"> 1491</span> </div>
<div class="line"><a id="l01492" name="l01492"></a><span class="lineno"> 1492</span>  m_hndl_snd.emplace(std::move(snd));</div>
<div class="line"><a id="l01493" name="l01493"></a><span class="lineno"> 1493</span>  m_hndl_rcv.emplace(std::move(rcv));</div>
<div class="line"><a id="l01494" name="l01494"></a><span class="lineno"> 1494</span> </div>
<div class="line"><a id="l01495" name="l01495"></a><span class="lineno"> 1495</span>  FLOW_LOG_INFO(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: &quot;</span></div>
<div class="line"><a id="l01496" name="l01496"></a><span class="lineno"> 1496</span>                <span class="stringliteral">&quot;Added handle pipe with separate sender/receiver (details to the left here).&quot;</span>);</div>
<div class="line"><a id="l01497" name="l01497"></a><span class="lineno"> 1497</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01498" name="l01498"></a><span class="lineno"> 1498</span>} <span class="comment">// Channel::init_native_handle_pipe()</span></div>
<div class="line"><a id="l01499" name="l01499"></a><span class="lineno"> 1499</span> </div>
<div class="line"><a id="l01500" name="l01500"></a><span class="lineno"> 1500</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01501" name="l01501"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a43c79955b3ad0eab347550b4263523ec"> 1501</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::initialized(<span class="keywordtype">bool</span> suppress_log)<span class="keyword"> const</span></div>
<div class="line"><a id="l01502" name="l01502"></a><span class="lineno"> 1502</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01503" name="l01503"></a><span class="lineno"> 1503</span>  <span class="comment">/* These checks are the bottom line -- static_assert()s and `if constexpr()`s checked everything else already.</span></div>
<div class="line"><a id="l01504" name="l01504"></a><span class="lineno"> 1504</span><span class="comment">   * (In particular: static_assert() already assured at least one pipe is enabled type-wise.  So just check each</span></div>
<div class="line"><a id="l01505" name="l01505"></a><span class="lineno"> 1505</span><span class="comment">   * pipe separately.)  Even these checks could be more economical (but wordier); as for instance it would not</span></div>
<div class="line"><a id="l01506" name="l01506"></a><span class="lineno"> 1506</span><span class="comment">   * have been possible for S_HAS_BLOB_PIPE=false but m_blob_snd=true; but let&#39;s just keep it simple. */</span></div>
<div class="line"><a id="l01507" name="l01507"></a><span class="lineno"> 1507</span> </div>
<div class="line"><a id="l01508" name="l01508"></a><span class="lineno"> 1508</span>  <span class="keywordflow">if</span> (S_HAS_BLOB_PIPE != <span class="keywordtype">bool</span>(m_blob_snd))</div>
<div class="line"><a id="l01509" name="l01509"></a><span class="lineno"> 1509</span>  {</div>
<div class="line"><a id="l01510" name="l01510"></a><span class="lineno"> 1510</span>    <span class="keywordflow">if</span> (!suppress_log)</div>
<div class="line"><a id="l01511" name="l01511"></a><span class="lineno"> 1511</span>    {</div>
<div class="line"><a id="l01512" name="l01512"></a><span class="lineno"> 1512</span>      FLOW_LOG_WARNING(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: &quot;</span></div>
<div class="line"><a id="l01513" name="l01513"></a><span class="lineno"> 1513</span>                       <span class="stringliteral">&quot;Blob_sender=/=Null_peer? = [&quot;</span> &lt;&lt; S_HAS_BLOB_PIPE &lt;&lt; <span class="stringliteral">&quot;]; yet &quot;</span></div>
<div class="line"><a id="l01514" name="l01514"></a><span class="lineno"> 1514</span>                       <span class="stringliteral">&quot;the Blob_sender has been initialized? = [&quot;</span> &lt;&lt; <span class="keywordtype">bool</span>(m_blob_snd) &lt;&lt; <span class="stringliteral">&quot;].  Misconfigured?  Bug?&quot;</span>);</div>
<div class="line"><a id="l01515" name="l01515"></a><span class="lineno"> 1515</span>    }</div>
<div class="line"><a id="l01516" name="l01516"></a><span class="lineno"> 1516</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01517" name="l01517"></a><span class="lineno"> 1517</span>  }</div>
<div class="line"><a id="l01518" name="l01518"></a><span class="lineno"> 1518</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01519" name="l01519"></a><span class="lineno"> 1519</span> </div>
<div class="line"><a id="l01520" name="l01520"></a><span class="lineno"> 1520</span>  <span class="keywordflow">if</span> (S_HAS_NATIVE_HANDLE_PIPE != <span class="keywordtype">bool</span>(m_hndl_snd))</div>
<div class="line"><a id="l01521" name="l01521"></a><span class="lineno"> 1521</span>  {</div>
<div class="line"><a id="l01522" name="l01522"></a><span class="lineno"> 1522</span>    <span class="keywordflow">if</span> (!suppress_log)</div>
<div class="line"><a id="l01523" name="l01523"></a><span class="lineno"> 1523</span>    {</div>
<div class="line"><a id="l01524" name="l01524"></a><span class="lineno"> 1524</span>      FLOW_LOG_WARNING(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: &quot;</span></div>
<div class="line"><a id="l01525" name="l01525"></a><span class="lineno"> 1525</span>                       <span class="stringliteral">&quot;Native_handle_sender=/=Null_peer? = [&quot;</span> &lt;&lt; S_HAS_NATIVE_HANDLE_PIPE &lt;&lt; <span class="stringliteral">&quot;]; yet &quot;</span></div>
<div class="line"><a id="l01526" name="l01526"></a><span class="lineno"> 1526</span>                       <span class="stringliteral">&quot;the Native_handle_sender has been initialized? = [&quot;</span> &lt;&lt; <span class="keywordtype">bool</span>(m_hndl_snd) &lt;&lt; <span class="stringliteral">&quot;].  &quot;</span></div>
<div class="line"><a id="l01527" name="l01527"></a><span class="lineno"> 1527</span>                       <span class="stringliteral">&quot;Misconfigured?  Bug?&quot;</span>);</div>
<div class="line"><a id="l01528" name="l01528"></a><span class="lineno"> 1528</span>    }</div>
<div class="line"><a id="l01529" name="l01529"></a><span class="lineno"> 1529</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01530" name="l01530"></a><span class="lineno"> 1530</span>  }</div>
<div class="line"><a id="l01531" name="l01531"></a><span class="lineno"> 1531</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l01532" name="l01532"></a><span class="lineno"> 1532</span> </div>
<div class="line"><a id="l01533" name="l01533"></a><span class="lineno"> 1533</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01534" name="l01534"></a><span class="lineno"> 1534</span>} <span class="comment">// Channel::initialized()</span></div>
<div class="line"><a id="l01535" name="l01535"></a><span class="lineno"> 1535</span> </div>
<div class="line"><a id="l01536" name="l01536"></a><span class="lineno"> 1536</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01537" name="l01537"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a647bc9b6f8b9fb0b546cf3879cb5d4c1"> 1537</a></span><span class="keyword">typename</span> CLASS_CHANNEL::Blob_sender_obj* CLASS_CHANNEL::blob_snd()</div>
<div class="line"><a id="l01538" name="l01538"></a><span class="lineno"> 1538</span>{</div>
<div class="line"><a id="l01539" name="l01539"></a><span class="lineno"> 1539</span>  <span class="keyword">static_assert</span>(S_HAS_BLOB_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01540" name="l01540"></a><span class="lineno"> 1540</span>  <span class="keywordflow">return</span> &amp;(*m_blob_snd);</div>
<div class="line"><a id="l01541" name="l01541"></a><span class="lineno"> 1541</span>}</div>
<div class="line"><a id="l01542" name="l01542"></a><span class="lineno"> 1542</span> </div>
<div class="line"><a id="l01543" name="l01543"></a><span class="lineno"> 1543</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01544" name="l01544"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a87fd94fa483cabd78059a3d1d094880d"> 1544</a></span><span class="keyword">typename</span> CLASS_CHANNEL::Blob_receiver_obj* CLASS_CHANNEL::blob_rcv()</div>
<div class="line"><a id="l01545" name="l01545"></a><span class="lineno"> 1545</span>{</div>
<div class="line"><a id="l01546" name="l01546"></a><span class="lineno"> 1546</span>  <span class="keyword">static_assert</span>(S_HAS_BLOB_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01547" name="l01547"></a><span class="lineno"> 1547</span> </div>
<div class="line"><a id="l01548" name="l01548"></a><span class="lineno"> 1548</span>  <span class="comment">// Type-safety ensured in init_blob_pipe().</span></div>
<div class="line"><a id="l01549" name="l01549"></a><span class="lineno"> 1549</span>  <span class="keywordflow">return</span> m_blob_rcv</div>
<div class="line"><a id="l01550" name="l01550"></a><span class="lineno"> 1550</span>           ? &amp;(*m_blob_rcv)</div>
<div class="line"><a id="l01551" name="l01551"></a><span class="lineno"> 1551</span>           : (m_blob_snd ? &amp;(<span class="keyword">reinterpret_cast&lt;</span><a class="code hl_class" href="classipc_1_1transport_1_1Blob__receiver.html">Blob_receiver_obj</a>&amp;<span class="keyword">&gt;</span>(*m_blob_snd))</div>
<div class="line"><a id="l01552" name="l01552"></a><span class="lineno"> 1552</span>                         : <span class="keyword">nullptr</span>);</div>
<div class="line"><a id="l01553" name="l01553"></a><span class="lineno"> 1553</span>}</div>
<div class="line"><a id="l01554" name="l01554"></a><span class="lineno"> 1554</span> </div>
<div class="line"><a id="l01555" name="l01555"></a><span class="lineno"> 1555</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01556" name="l01556"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#aa838026c33e4e422df7cd78d3a426b6a"> 1556</a></span><span class="keyword">typename</span> CLASS_CHANNEL::Native_handle_sender_obj* CLASS_CHANNEL::hndl_snd()</div>
<div class="line"><a id="l01557" name="l01557"></a><span class="lineno"> 1557</span>{</div>
<div class="line"><a id="l01558" name="l01558"></a><span class="lineno"> 1558</span>  <span class="keyword">static_assert</span>(S_HAS_NATIVE_HANDLE_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01559" name="l01559"></a><span class="lineno"> 1559</span>  <span class="keywordflow">return</span> &amp;(*m_hndl_snd);</div>
<div class="line"><a id="l01560" name="l01560"></a><span class="lineno"> 1560</span>}</div>
<div class="line"><a id="l01561" name="l01561"></a><span class="lineno"> 1561</span> </div>
<div class="line"><a id="l01562" name="l01562"></a><span class="lineno"> 1562</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01563" name="l01563"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#af4c9cd7b02193fa2e8bf1742ab87111a"> 1563</a></span><span class="keyword">typename</span> CLASS_CHANNEL::Native_handle_receiver_obj* CLASS_CHANNEL::hndl_rcv()</div>
<div class="line"><a id="l01564" name="l01564"></a><span class="lineno"> 1564</span>{</div>
<div class="line"><a id="l01565" name="l01565"></a><span class="lineno"> 1565</span>  <span class="keyword">static_assert</span>(S_HAS_NATIVE_HANDLE_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01566" name="l01566"></a><span class="lineno"> 1566</span> </div>
<div class="line"><a id="l01567" name="l01567"></a><span class="lineno"> 1567</span>  <span class="comment">// Type-safety ensured in init_native_handle_pipe().</span></div>
<div class="line"><a id="l01568" name="l01568"></a><span class="lineno"> 1568</span>  <span class="keywordflow">return</span> m_hndl_rcv</div>
<div class="line"><a id="l01569" name="l01569"></a><span class="lineno"> 1569</span>           ? &amp;(*m_hndl_rcv)</div>
<div class="line"><a id="l01570" name="l01570"></a><span class="lineno"> 1570</span>           : (m_hndl_snd ? &amp;(<span class="keyword">reinterpret_cast&lt;</span><a class="code hl_class" href="classipc_1_1transport_1_1Native__handle__receiver.html">Native_handle_receiver_obj</a>&amp;<span class="keyword">&gt;</span>(*m_hndl_snd))</div>
<div class="line"><a id="l01571" name="l01571"></a><span class="lineno"> 1571</span>                         : <span class="keyword">nullptr</span>);</div>
<div class="line"><a id="l01572" name="l01572"></a><span class="lineno"> 1572</span>}</div>
<div class="line"><a id="l01573" name="l01573"></a><span class="lineno"> 1573</span> </div>
<div class="line"><a id="l01574" name="l01574"></a><span class="lineno"> 1574</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01575" name="l01575"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a9e1a2db827082d9467bf45ae0bbf64d3"> 1575</a></span><span class="keyword">const</span> <span class="keyword">typename</span> CLASS_CHANNEL::Blob_sender_obj* CLASS_CHANNEL::blob_snd()<span class="keyword"> const</span></div>
<div class="line"><a id="l01576" name="l01576"></a><span class="lineno"> 1576</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01577" name="l01577"></a><span class="lineno"> 1577</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span><a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>*<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;blob_snd();</div>
<div class="line"><a id="l01578" name="l01578"></a><span class="lineno"> 1578</span>}</div>
<div class="line"><a id="l01579" name="l01579"></a><span class="lineno"> 1579</span> </div>
<div class="line"><a id="l01580" name="l01580"></a><span class="lineno"> 1580</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01581" name="l01581"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a5a34248f5e11a1dd2d5a52e07ae836e7"> 1581</a></span><span class="keyword">const</span> <span class="keyword">typename</span> CLASS_CHANNEL::Blob_receiver_obj* CLASS_CHANNEL::blob_rcv()<span class="keyword"> const</span></div>
<div class="line"><a id="l01582" name="l01582"></a><span class="lineno"> 1582</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01583" name="l01583"></a><span class="lineno"> 1583</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span><a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>*<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;blob_rcv();</div>
<div class="line"><a id="l01584" name="l01584"></a><span class="lineno"> 1584</span>}</div>
<div class="line"><a id="l01585" name="l01585"></a><span class="lineno"> 1585</span> </div>
<div class="line"><a id="l01586" name="l01586"></a><span class="lineno"> 1586</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01587" name="l01587"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a970d77e3a5ac117d9b60dfddbf0914fe"> 1587</a></span><span class="keyword">const</span> <span class="keyword">typename</span> CLASS_CHANNEL::Native_handle_sender_obj* CLASS_CHANNEL::hndl_snd()<span class="keyword"> const</span></div>
<div class="line"><a id="l01588" name="l01588"></a><span class="lineno"> 1588</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01589" name="l01589"></a><span class="lineno"> 1589</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span><a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>*<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;hndl_snd();</div>
<div class="line"><a id="l01590" name="l01590"></a><span class="lineno"> 1590</span>}</div>
<div class="line"><a id="l01591" name="l01591"></a><span class="lineno"> 1591</span> </div>
<div class="line"><a id="l01592" name="l01592"></a><span class="lineno"> 1592</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01593" name="l01593"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a387590af263932dbdb24bcac4b399170"> 1593</a></span><span class="keyword">const</span> <span class="keyword">typename</span> CLASS_CHANNEL::Native_handle_receiver_obj* CLASS_CHANNEL::hndl_rcv()<span class="keyword"> const</span></div>
<div class="line"><a id="l01594" name="l01594"></a><span class="lineno"> 1594</span><span class="keyword"></span>{</div>
<div class="line"><a id="l01595" name="l01595"></a><span class="lineno"> 1595</span>  <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span><a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Channel</a>*<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;hndl_rcv();</div>
<div class="line"><a id="l01596" name="l01596"></a><span class="lineno"> 1596</span>}</div>
<div class="line"><a id="l01597" name="l01597"></a><span class="lineno"> 1597</span> </div>
<div class="line"><a id="l01598" name="l01598"></a><span class="lineno"> 1598</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01599" name="l01599"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a688de69c7de2aef9604b9e868feb3a9e"> 1599</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::send_blob(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">util::Blob_const</a>&amp; blob, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l01600" name="l01600"></a><span class="lineno"> 1600</span>{</div>
<div class="line"><a id="l01601" name="l01601"></a><span class="lineno"> 1601</span>  <span class="keyword">static_assert</span>(S_HAS_BLOB_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01602" name="l01602"></a><span class="lineno"> 1602</span> </div>
<div class="line"><a id="l01603" name="l01603"></a><span class="lineno"> 1603</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_snd();</div>
<div class="line"><a id="l01604" name="l01604"></a><span class="lineno"> 1604</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01605" name="l01605"></a><span class="lineno"> 1605</span> </div>
<div class="line"><a id="l01606" name="l01606"></a><span class="lineno"> 1606</span>  <span class="keywordflow">return</span> peer-&gt;send_blob(blob, err_code);</div>
<div class="line"><a id="l01607" name="l01607"></a><span class="lineno"> 1607</span>} <span class="comment">// Channel::send_blob()</span></div>
<div class="line"><a id="l01608" name="l01608"></a><span class="lineno"> 1608</span> </div>
<div class="line"><a id="l01609" name="l01609"></a><span class="lineno"> 1609</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01610" name="l01610"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a864cae23c5a6f318e285d4c2fe65ece4"> 1610</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::send_native_handle(<a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a> hndl_or_null, <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">util::Blob_const</a>&amp; meta_blob,</div>
<div class="line"><a id="l01611" name="l01611"></a><span class="lineno"> 1611</span>                                       <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l01612" name="l01612"></a><span class="lineno"> 1612</span>{</div>
<div class="line"><a id="l01613" name="l01613"></a><span class="lineno"> 1613</span>  <span class="keyword">static_assert</span>(S_HAS_NATIVE_HANDLE_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01614" name="l01614"></a><span class="lineno"> 1614</span> </div>
<div class="line"><a id="l01615" name="l01615"></a><span class="lineno"> 1615</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_snd();</div>
<div class="line"><a id="l01616" name="l01616"></a><span class="lineno"> 1616</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01617" name="l01617"></a><span class="lineno"> 1617</span> </div>
<div class="line"><a id="l01618" name="l01618"></a><span class="lineno"> 1618</span>  <span class="keywordflow">return</span> peer-&gt;send_native_handle(hndl_or_null, meta_blob, err_code);</div>
<div class="line"><a id="l01619" name="l01619"></a><span class="lineno"> 1619</span>} <span class="comment">// Channel::send_native_handle()</span></div>
<div class="line"><a id="l01620" name="l01620"></a><span class="lineno"> 1620</span> </div>
<div class="line"><a id="l01621" name="l01621"></a><span class="lineno"> 1621</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01622" name="l01622"></a><span class="lineno"> 1622</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Task_err&gt;</div>
<div class="line"><a id="l01623" name="l01623"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a37fcdfdbefd8ee7e374b0596782ad128"> 1623</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::async_end_sending(Task_err&amp;&amp; on_done_func)</div>
<div class="line"><a id="l01624" name="l01624"></a><span class="lineno"> 1624</span>{</div>
<div class="line"><a id="l01625" name="l01625"></a><span class="lineno"> 1625</span>  <span class="keyword">static_assert</span>(S_IS_ASYNC_IO_OBJ, <span class="stringliteral">&quot;This overload usable only with async-I/O-pattern object.&quot;</span>);</div>
<div class="line"><a id="l01626" name="l01626"></a><span class="lineno"> 1626</span> </div>
<div class="line"><a id="l01627" name="l01627"></a><span class="lineno"> 1627</span>  <span class="keyword">using </span>flow::async::Task_asio_err;</div>
<div class="line"><a id="l01628" name="l01628"></a><span class="lineno"> 1628</span>  <span class="keyword">using </span>flow::util::Mutex_non_recursive;</div>
<div class="line"><a id="l01629" name="l01629"></a><span class="lineno"> 1629</span>  <span class="keyword">using </span>flow::util::Lock_guard;</div>
<div class="line"><a id="l01630" name="l01630"></a><span class="lineno"> 1630</span>  <span class="keyword">using </span>boost::make_shared;</div>
<div class="line"><a id="l01631" name="l01631"></a><span class="lineno"> 1631</span> </div>
<div class="line"><a id="l01632" name="l01632"></a><span class="lineno"> 1632</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_BLOB_PIPE_ONLY)</div>
<div class="line"><a id="l01633" name="l01633"></a><span class="lineno"> 1633</span>  {</div>
<div class="line"><a id="l01634" name="l01634"></a><span class="lineno"> 1634</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_snd();</div>
<div class="line"><a id="l01635" name="l01635"></a><span class="lineno"> 1635</span>    assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01636" name="l01636"></a><span class="lineno"> 1636</span> </div>
<div class="line"><a id="l01637" name="l01637"></a><span class="lineno"> 1637</span>    <span class="keywordflow">return</span> peer-&gt;async_end_sending(std::move(on_done_func));</div>
<div class="line"><a id="l01638" name="l01638"></a><span class="lineno"> 1638</span>  }</div>
<div class="line"><a id="l01639" name="l01639"></a><span class="lineno"> 1639</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_NATIVE_HANDLE_PIPE_ONLY)</div>
<div class="line"><a id="l01640" name="l01640"></a><span class="lineno"> 1640</span>  {</div>
<div class="line"><a id="l01641" name="l01641"></a><span class="lineno"> 1641</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_snd();</div>
<div class="line"><a id="l01642" name="l01642"></a><span class="lineno"> 1642</span>    assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01643" name="l01643"></a><span class="lineno"> 1643</span> </div>
<div class="line"><a id="l01644" name="l01644"></a><span class="lineno"> 1644</span>    <span class="keywordflow">return</span> peer-&gt;async_end_sending(std::move(on_done_func));</div>
<div class="line"><a id="l01645" name="l01645"></a><span class="lineno"> 1645</span>  }</div>
<div class="line"><a id="l01646" name="l01646"></a><span class="lineno"> 1646</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l01647" name="l01647"></a><span class="lineno"> 1647</span>  {</div>
<div class="line"><a id="l01648" name="l01648"></a><span class="lineno"> 1648</span>    <span class="keyword">static_assert</span>(S_HAS_2_PIPES, <span class="stringliteral">&quot;Wat!&quot;</span>);</div>
<div class="line"><a id="l01649" name="l01649"></a><span class="lineno"> 1649</span> </div>
<div class="line"><a id="l01650" name="l01650"></a><span class="lineno"> 1650</span>    FLOW_LOG_INFO(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Request to send/queue graceful-close; shall proceed along &quot;</span></div>
<div class="line"><a id="l01651" name="l01651"></a><span class="lineno"> 1651</span>                  <span class="stringliteral">&quot;the 1-2 pipes listed earlier in this message; if not dupe-call; and &quot;</span></div>
<div class="line"><a id="l01652" name="l01652"></a><span class="lineno"> 1652</span>                  <span class="stringliteral">&quot;both pipes available then the on-done callback shall be invoked after the later of 2 individual &quot;</span></div>
<div class="line"><a id="l01653" name="l01653"></a><span class="lineno"> 1653</span>                  <span class="stringliteral">&quot;on-done callbacks triggers.&quot;</span>);</div>
<div class="line"><a id="l01654" name="l01654"></a><span class="lineno"> 1654</span> </div>
<div class="line"><a id="l01655" name="l01655"></a><span class="lineno"> 1655</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer1 = blob_snd();</div>
<div class="line"><a id="l01656" name="l01656"></a><span class="lineno"> 1656</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer2 = hndl_snd();</div>
<div class="line"><a id="l01657" name="l01657"></a><span class="lineno"> 1657</span>    assert(peer1 &amp;&amp; peer2 &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01658" name="l01658"></a><span class="lineno"> 1658</span> </div>
<div class="line"><a id="l01659" name="l01659"></a><span class="lineno"> 1659</span>    <span class="comment">/* This is the only real logic we have to worry about in Channel concept-implementing API, because</span></div>
<div class="line"><a id="l01660" name="l01660"></a><span class="lineno"> 1660</span><span class="comment">     * async_end_sending() doc header promises to apply to both pipes, and indeed both pipes are enabled.</span></div>
<div class="line"><a id="l01661" name="l01661"></a><span class="lineno"> 1661</span><span class="comment">     * We promised that on_done_func() shall be invoked after each pipe&#39;s completion handler has finished.</span></div>
<div class="line"><a id="l01662" name="l01662"></a><span class="lineno"> 1662</span><span class="comment">     * So we just wrap on_done_func() with a handler that tracks whether it&#39;s the 1st or 2nd handler;</span></div>
<div class="line"><a id="l01663" name="l01663"></a><span class="lineno"> 1663</span><span class="comment">     * and in the latter case invokes the real on_done_func().</span></div>
<div class="line"><a id="l01664" name="l01664"></a><span class="lineno"> 1664</span><span class="comment">     *</span></div>
<div class="line"><a id="l01665" name="l01665"></a><span class="lineno"> 1665</span><span class="comment">     * The other difficulty is to track the error result.  We promised the following semantics:</span></div>
<div class="line"><a id="l01666" name="l01666"></a><span class="lineno"> 1666</span><span class="comment">     *   - If no error occurs report success (duh).</span></div>
<div class="line"><a id="l01667" name="l01667"></a><span class="lineno"> 1667</span><span class="comment">     *   - If one error occurs, while the other one succeeds, report the one error (duh).</span></div>
<div class="line"><a id="l01668" name="l01668"></a><span class="lineno"> 1668</span><span class="comment">     *   - If both fail report the first one to happen chronologically.</span></div>
<div class="line"><a id="l01669" name="l01669"></a><span class="lineno"> 1669</span><span class="comment">     *</span></div>
<div class="line"><a id="l01670" name="l01670"></a><span class="lineno"> 1670</span><span class="comment">     * So we track all that in a simple State struct which exists in the universe via capture by shared_ptr</span></div>
<div class="line"><a id="l01671" name="l01671"></a><span class="lineno"> 1671</span><span class="comment">     * until the 2nd completion handler runs.</span></div>
<div class="line"><a id="l01672" name="l01672"></a><span class="lineno"> 1672</span><span class="comment">     *</span></div>
<div class="line"><a id="l01673" name="l01673"></a><span class="lineno"> 1673</span><span class="comment">     * Thready safety: More details below but just a reminder: F in X.async_end_sending(F) is invoked at some point</span></div>
<div class="line"><a id="l01674" name="l01674"></a><span class="lineno"> 1674</span><span class="comment">     * no matter what (at the latest, when X is destroyed); and it is invoked from some unspecified thread that</span></div>
<div class="line"><a id="l01675" name="l01675"></a><span class="lineno"> 1675</span><span class="comment">     * is not the current thread (in which we are now executing) -- for async-I/O pattern -- or else at a time</span></div>
<div class="line"><a id="l01676" name="l01676"></a><span class="lineno"> 1676</span><span class="comment">     * of the user&#39;s choosing synchronously (sync_io pattern).  Since we do</span></div>
<div class="line"><a id="l01677" name="l01677"></a><span class="lineno"> 1677</span><span class="comment">     * X1.async_end_sending(F1) + X2.async_end_sending(F2), F1() and F2() very well might execute concurrently.</span></div>
<div class="line"><a id="l01678" name="l01678"></a><span class="lineno"> 1678</span><span class="comment">     * So we *do* need to protect against concurrent access if any. */</span></div>
<div class="line"><a id="l01679" name="l01679"></a><span class="lineno"> 1679</span> </div>
<div class="line"><a id="l01680" name="l01680"></a><span class="lineno"> 1680</span>    <span class="keyword">struct </span>State</div>
<div class="line"><a id="l01681" name="l01681"></a><span class="lineno"> 1681</span>    {</div>
<div class="line"><a id="l01682" name="l01682"></a><span class="lineno"> 1682</span>      Mutex_non_recursive m_mutex; <span class="comment">// Protects m_n_done and m_err_code1.</span></div>
<div class="line"><a id="l01683" name="l01683"></a><span class="lineno"> 1683</span>      <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_n_done; <span class="comment">// Init: 0.</span></div>
<div class="line"><a id="l01684" name="l01684"></a><span class="lineno"> 1684</span>      <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a> m_err_code1; <span class="comment">// Init: Success.</span></div>
<div class="line"><a id="l01685" name="l01685"></a><span class="lineno"> 1685</span>      Task_asio_err m_on_done_func; <span class="comment">// Set just below.  (Thread safety: It is only read once hence no sync required.)</span></div>
<div class="line"><a id="l01686" name="l01686"></a><span class="lineno"> 1686</span>    };</div>
<div class="line"><a id="l01687" name="l01687"></a><span class="lineno"> 1687</span>    <span class="keyword">const</span> <span class="keyword">auto</span> state = make_shared&lt;State&gt;();</div>
<div class="line"><a id="l01688" name="l01688"></a><span class="lineno"> 1688</span>    state-&gt;m_on_done_func = std::move(on_done_func); <span class="comment">// @todo Make m_on_done_func const; use {} init semantics.</span></div>
<div class="line"><a id="l01689" name="l01689"></a><span class="lineno"> 1689</span> </div>
<div class="line"><a id="l01690" name="l01690"></a><span class="lineno"> 1690</span>    <span class="keyword">auto</span> combined_on_done = [state](<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>&amp; async_err_code) <span class="keyword">mutable</span></div>
<div class="line"><a id="l01691" name="l01691"></a><span class="lineno"> 1691</span>    {</div>
<div class="line"><a id="l01692" name="l01692"></a><span class="lineno"> 1692</span>      <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a> err_code = async_err_code; <span class="comment">// We may overwrite it.</span></div>
<div class="line"><a id="l01693" name="l01693"></a><span class="lineno"> 1693</span>      {</div>
<div class="line"><a id="l01694" name="l01694"></a><span class="lineno"> 1694</span>        Lock_guard&lt;Mutex_non_recursive&gt; lock(state-&gt;m_mutex);</div>
<div class="line"><a id="l01695" name="l01695"></a><span class="lineno"> 1695</span>        <span class="keyword">const</span> <span class="keyword">auto</span> post_n_done = ++state-&gt;m_n_done;</div>
<div class="line"><a id="l01696" name="l01696"></a><span class="lineno"> 1696</span>        <span class="keyword">const</span> <span class="keywordtype">bool</span> all_done = post_n_done == 2;</div>
<div class="line"><a id="l01697" name="l01697"></a><span class="lineno"> 1697</span>        assert((post_n_done == 1) || all_done);</div>
<div class="line"><a id="l01698" name="l01698"></a><span class="lineno"> 1698</span> </div>
<div class="line"><a id="l01699" name="l01699"></a><span class="lineno"> 1699</span>        <span class="keywordflow">if</span> (!all_done)</div>
<div class="line"><a id="l01700" name="l01700"></a><span class="lineno"> 1700</span>        {</div>
<div class="line"><a id="l01701" name="l01701"></a><span class="lineno"> 1701</span>          <span class="comment">// Wwe are the 1st handler to fire&gt;: Mark down the result for the (all_done) clause below.</span></div>
<div class="line"><a id="l01702" name="l01702"></a><span class="lineno"> 1702</span>          state-&gt;m_err_code1 = err_code;</div>
<div class="line"><a id="l01703" name="l01703"></a><span class="lineno"> 1703</span>          <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01704" name="l01704"></a><span class="lineno"> 1704</span>        }</div>
<div class="line"><a id="l01705" name="l01705"></a><span class="lineno"> 1705</span>        <span class="comment">// else if (&lt;we are the 2nd handler to fire&gt;):</span></div>
<div class="line"><a id="l01706" name="l01706"></a><span class="lineno"> 1706</span> </div>
<div class="line"><a id="l01707" name="l01707"></a><span class="lineno"> 1707</span>        <span class="comment">// Report the 1st error to occur; or success if none occurred.</span></div>
<div class="line"><a id="l01708" name="l01708"></a><span class="lineno"> 1708</span>        <span class="keywordflow">if</span> (state-&gt;m_err_code1)</div>
<div class="line"><a id="l01709" name="l01709"></a><span class="lineno"> 1709</span>        {</div>
<div class="line"><a id="l01710" name="l01710"></a><span class="lineno"> 1710</span>          err_code = state-&gt;m_err_code1;</div>
<div class="line"><a id="l01711" name="l01711"></a><span class="lineno"> 1711</span>        }</div>
<div class="line"><a id="l01712" name="l01712"></a><span class="lineno"> 1712</span>        <span class="comment">// else { err_code remains == async_err_code. }</span></div>
<div class="line"><a id="l01713" name="l01713"></a><span class="lineno"> 1713</span>      } <span class="comment">// Lock_guard&lt;Mutex_non_recursive&gt; lock(state-&gt;m_mutex);</span></div>
<div class="line"><a id="l01714" name="l01714"></a><span class="lineno"> 1714</span> </div>
<div class="line"><a id="l01715" name="l01715"></a><span class="lineno"> 1715</span>      state-&gt;m_on_done_func(err_code);</div>
<div class="line"><a id="l01716" name="l01716"></a><span class="lineno"> 1716</span>    }; <span class="comment">// auto combined_on_done =</span></div>
<div class="line"><a id="l01717" name="l01717"></a><span class="lineno"> 1717</span> </div>
<div class="line"><a id="l01718" name="l01718"></a><span class="lineno"> 1718</span>    <span class="keywordflow">if</span> (!peer1-&gt;async_end_sending(Task_asio_err(combined_on_done))) <span class="comment">// Copy combined_on_done for the call below.</span></div>
<div class="line"><a id="l01719" name="l01719"></a><span class="lineno"> 1719</span>    {</div>
<div class="line"><a id="l01720" name="l01720"></a><span class="lineno"> 1720</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01721" name="l01721"></a><span class="lineno"> 1721</span>    }</div>
<div class="line"><a id="l01722" name="l01722"></a><span class="lineno"> 1722</span>    <span class="comment">// else see our contract.</span></div>
<div class="line"><a id="l01723" name="l01723"></a><span class="lineno"> 1723</span> </div>
<div class="line"><a id="l01724" name="l01724"></a><span class="lineno"> 1724</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l01725" name="l01725"></a><span class="lineno"> 1725</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> ok =</div>
<div class="line"><a id="l01726" name="l01726"></a><span class="lineno"> 1726</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01727" name="l01727"></a><span class="lineno"> 1727</span>    peer2-&gt;async_end_sending(std::move(combined_on_done));</div>
<div class="line"><a id="l01728" name="l01728"></a><span class="lineno"> 1728</span>    assert(ok &amp;&amp; <span class="stringliteral">&quot;Either both should be dupe-calls or neither; do not use them individually only to then use this.&quot;</span>);</div>
<div class="line"><a id="l01729" name="l01729"></a><span class="lineno"> 1729</span>    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01730" name="l01730"></a><span class="lineno"> 1730</span>  } <span class="comment">// else if constexpr(S_HAS_2_PIPES)</span></div>
<div class="line"><a id="l01731" name="l01731"></a><span class="lineno"> 1731</span>} <span class="comment">// Channel::async_end_sending()</span></div>
<div class="line"><a id="l01732" name="l01732"></a><span class="lineno"> 1732</span> </div>
<div class="line"><a id="l01733" name="l01733"></a><span class="lineno"> 1733</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01734" name="l01734"></a><span class="lineno"> 1734</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Task_err&gt;</div>
<div class="line"><a id="l01735" name="l01735"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a53cbf199e2ed09b7afb216c96ab63fb0"> 1735</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::async_end_sending(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* sync_err_code_ptr, Task_err&amp;&amp; on_done_func)</div>
<div class="line"><a id="l01736" name="l01736"></a><span class="lineno"> 1736</span>{</div>
<div class="line"><a id="l01737" name="l01737"></a><span class="lineno"> 1737</span>  <span class="keyword">static_assert</span>(S_IS_SYNC_IO_OBJ, <span class="stringliteral">&quot;This overload usable only with sync_io-pattern object.&quot;</span>);</div>
<div class="line"><a id="l01738" name="l01738"></a><span class="lineno"> 1738</span> </div>
<div class="line"><a id="l01739" name="l01739"></a><span class="lineno"> 1739</span>  <span class="keyword">using </span>flow::async::Task_asio_err;</div>
<div class="line"><a id="l01740" name="l01740"></a><span class="lineno"> 1740</span>  <span class="keyword">using </span>boost::make_shared;</div>
<div class="line"><a id="l01741" name="l01741"></a><span class="lineno"> 1741</span>  <span class="keyword">using </span>std::atomic;</div>
<div class="line"><a id="l01742" name="l01742"></a><span class="lineno"> 1742</span> </div>
<div class="line"><a id="l01743" name="l01743"></a><span class="lineno"> 1743</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_BLOB_PIPE_ONLY)</div>
<div class="line"><a id="l01744" name="l01744"></a><span class="lineno"> 1744</span>  {</div>
<div class="line"><a id="l01745" name="l01745"></a><span class="lineno"> 1745</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_snd();</div>
<div class="line"><a id="l01746" name="l01746"></a><span class="lineno"> 1746</span>    assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01747" name="l01747"></a><span class="lineno"> 1747</span> </div>
<div class="line"><a id="l01748" name="l01748"></a><span class="lineno"> 1748</span>    <span class="keywordflow">return</span> peer-&gt;async_end_sending(sync_err_code_ptr, std::move(on_done_func));</div>
<div class="line"><a id="l01749" name="l01749"></a><span class="lineno"> 1749</span>  }</div>
<div class="line"><a id="l01750" name="l01750"></a><span class="lineno"> 1750</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_NATIVE_HANDLE_PIPE_ONLY)</div>
<div class="line"><a id="l01751" name="l01751"></a><span class="lineno"> 1751</span>  {</div>
<div class="line"><a id="l01752" name="l01752"></a><span class="lineno"> 1752</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_snd();</div>
<div class="line"><a id="l01753" name="l01753"></a><span class="lineno"> 1753</span>    assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01754" name="l01754"></a><span class="lineno"> 1754</span> </div>
<div class="line"><a id="l01755" name="l01755"></a><span class="lineno"> 1755</span>    <span class="keywordflow">return</span> peer-&gt;async_end_sending(sync_err_code_ptr, std::move(on_done_func));</div>
<div class="line"><a id="l01756" name="l01756"></a><span class="lineno"> 1756</span>  }</div>
<div class="line"><a id="l01757" name="l01757"></a><span class="lineno"> 1757</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l01758" name="l01758"></a><span class="lineno"> 1758</span>  {</div>
<div class="line"><a id="l01759" name="l01759"></a><span class="lineno"> 1759</span>    <span class="keyword">static_assert</span>(S_HAS_2_PIPES, <span class="stringliteral">&quot;Wat!&quot;</span>);</div>
<div class="line"><a id="l01760" name="l01760"></a><span class="lineno"> 1760</span> </div>
<div class="line"><a id="l01761" name="l01761"></a><span class="lineno"> 1761</span>    FLOW_LOG_INFO(<span class="stringliteral">&quot;Channel [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: (SIO) Request to send/queue graceful-close; shall proceed along &quot;</span></div>
<div class="line"><a id="l01762" name="l01762"></a><span class="lineno"> 1762</span>                  <span class="stringliteral">&quot;the 2 pipes listed earlier in this message; if not dupe-call; and &quot;</span></div>
<div class="line"><a id="l01763" name="l01763"></a><span class="lineno"> 1763</span>                  <span class="stringliteral">&quot;both pipes available then the on-done callback shall be invoked after the later of 2 individual &quot;</span></div>
<div class="line"><a id="l01764" name="l01764"></a><span class="lineno"> 1764</span>                  <span class="stringliteral">&quot;on-done callbacks triggers.  If one completes synchronously then only one callback to await.&quot;</span>);</div>
<div class="line"><a id="l01765" name="l01765"></a><span class="lineno"> 1765</span> </div>
<div class="line"><a id="l01766" name="l01766"></a><span class="lineno"> 1766</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer1 = blob_snd();</div>
<div class="line"><a id="l01767" name="l01767"></a><span class="lineno"> 1767</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer2 = hndl_snd();</div>
<div class="line"><a id="l01768" name="l01768"></a><span class="lineno"> 1768</span>    assert(peer1 &amp;&amp; peer2 &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01769" name="l01769"></a><span class="lineno"> 1769</span> </div>
<div class="line"><a id="l01770" name="l01770"></a><span class="lineno"> 1770</span>    <span class="comment">/* See the async-I/O overload first.  Then come back here.  This one has to deal with that stuff plus</span></div>
<div class="line"><a id="l01771" name="l01771"></a><span class="lineno"> 1771</span><span class="comment">     * some more: that each .async_end_sending()</span></div>
<div class="line"><a id="l01772" name="l01772"></a><span class="lineno"> 1772</span><span class="comment">     *   - might complete synchronously instead of memorizing handler to invoke later;</span></div>
<div class="line"><a id="l01773" name="l01773"></a><span class="lineno"> 1773</span><span class="comment">     *   - either way has Flow error conventions: if passed null sync_err_code_ptr it will throw on error.</span></div>
<div class="line"><a id="l01774" name="l01774"></a><span class="lineno"> 1774</span><span class="comment">     *</span></div>
<div class="line"><a id="l01775" name="l01775"></a><span class="lineno"> 1775</span><span class="comment">     * That said the below should be reasonable self-explanatory. */</span></div>
<div class="line"><a id="l01776" name="l01776"></a><span class="lineno"> 1776</span> </div>
<div class="line"><a id="l01777" name="l01777"></a><span class="lineno"> 1777</span>    <span class="comment">/* Again: m_n_done reaching 2 is essentially a barrier for invoking m_on_done_func().  So it is the only datum</span></div>
<div class="line"><a id="l01778" name="l01778"></a><span class="lineno"> 1778</span><span class="comment">     * protected against concurrent access.  Since it&#39;s just an int, we use atomic&lt;&gt; for synchronization. */</span></div>
<div class="line"><a id="l01779" name="l01779"></a><span class="lineno"> 1779</span>    <span class="keyword">struct </span>State</div>
<div class="line"><a id="l01780" name="l01780"></a><span class="lineno"> 1780</span>    {</div>
<div class="line"><a id="l01781" name="l01781"></a><span class="lineno"> 1781</span>      atomic&lt;unsigned int&gt; m_n_done; <span class="comment">// Init: 0.  Thread safety: See preceding comment.</span></div>
<div class="line"><a id="l01782" name="l01782"></a><span class="lineno"> 1782</span>      <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a> m_err_code1; <span class="comment">// Init: Success.  Thread safety: It is only touched once hence no sync required.</span></div>
<div class="line"><a id="l01783" name="l01783"></a><span class="lineno"> 1783</span>      Task_asio_err m_on_done_func; <span class="comment">// Assigned just below.  Thread safety: It is only read once hence no sync required.</span></div>
<div class="line"><a id="l01784" name="l01784"></a><span class="lineno"> 1784</span>    };</div>
<div class="line"><a id="l01785" name="l01785"></a><span class="lineno"> 1785</span>    <span class="keyword">const</span> <span class="keyword">auto</span> state = make_shared&lt;State&gt;();</div>
<div class="line"><a id="l01786" name="l01786"></a><span class="lineno"> 1786</span>    state-&gt;m_on_done_func = std::move(on_done_func); <span class="comment">// @todo Make m_on_done_func const; use {} init semantics.</span></div>
<div class="line"><a id="l01787" name="l01787"></a><span class="lineno"> 1787</span> </div>
<div class="line"><a id="l01788" name="l01788"></a><span class="lineno"> 1788</span>    <span class="keyword">auto</span> combined_on_done = [state](<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>&amp; async_err_code) <span class="keyword">mutable</span></div>
<div class="line"><a id="l01789" name="l01789"></a><span class="lineno"> 1789</span>    {</div>
<div class="line"><a id="l01790" name="l01790"></a><span class="lineno"> 1790</span>      <span class="keyword">const</span> <span class="keyword">auto</span> post_n_done = ++state-&gt;m_n_done;</div>
<div class="line"><a id="l01791" name="l01791"></a><span class="lineno"> 1791</span>      <span class="keyword">const</span> <span class="keywordtype">bool</span> all_done = post_n_done == 2;</div>
<div class="line"><a id="l01792" name="l01792"></a><span class="lineno"> 1792</span>      assert((post_n_done == 1) || all_done);</div>
<div class="line"><a id="l01793" name="l01793"></a><span class="lineno"> 1793</span> </div>
<div class="line"><a id="l01794" name="l01794"></a><span class="lineno"> 1794</span>      <span class="keywordflow">if</span> (all_done) <span class="comment">// I.e., if (&lt;we are the 2nd handler to fire&gt;)</span></div>
<div class="line"><a id="l01795" name="l01795"></a><span class="lineno"> 1795</span>      {</div>
<div class="line"><a id="l01796" name="l01796"></a><span class="lineno"> 1796</span>        <span class="comment">// Report the 1st error to occur; or success if none occurred.</span></div>
<div class="line"><a id="l01797" name="l01797"></a><span class="lineno"> 1797</span>        state-&gt;m_on_done_func(state-&gt;m_err_code1 ? state-&gt;m_err_code1 : async_err_code);</div>
<div class="line"><a id="l01798" name="l01798"></a><span class="lineno"> 1798</span>        <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l01799" name="l01799"></a><span class="lineno"> 1799</span>      }</div>
<div class="line"><a id="l01800" name="l01800"></a><span class="lineno"> 1800</span>      <span class="comment">// else if (&lt;we are the 1st handler to fire&gt;): Mark down the result for the (all_done) clause above.</span></div>
<div class="line"><a id="l01801" name="l01801"></a><span class="lineno"> 1801</span>      state-&gt;m_err_code1 = async_err_code;</div>
<div class="line"><a id="l01802" name="l01802"></a><span class="lineno"> 1802</span>    };</div>
<div class="line"><a id="l01803" name="l01803"></a><span class="lineno"> 1803</span> </div>
<div class="line"><a id="l01804" name="l01804"></a><span class="lineno"> 1804</span>    <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a> sync_err_code1;</div>
<div class="line"><a id="l01805" name="l01805"></a><span class="lineno"> 1805</span>    <span class="keywordflow">if</span> (!peer1-&gt;async_end_sending(&amp;sync_err_code1,</div>
<div class="line"><a id="l01806" name="l01806"></a><span class="lineno"> 1806</span>                                  Task_asio_err(combined_on_done))) <span class="comment">// Copy combined_on_done for the call below.</span></div>
<div class="line"><a id="l01807" name="l01807"></a><span class="lineno"> 1807</span>    {</div>
<div class="line"><a id="l01808" name="l01808"></a><span class="lineno"> 1808</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01809" name="l01809"></a><span class="lineno"> 1809</span>    }</div>
<div class="line"><a id="l01810" name="l01810"></a><span class="lineno"> 1810</span>    <span class="comment">// else see our contract.</span></div>
<div class="line"><a id="l01811" name="l01811"></a><span class="lineno"> 1811</span> </div>
<div class="line"><a id="l01812" name="l01812"></a><span class="lineno"> 1812</span>    <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a> sync_err_code2;</div>
<div class="line"><a id="l01813" name="l01813"></a><span class="lineno"> 1813</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l01814" name="l01814"></a><span class="lineno"> 1814</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> ok =</div>
<div class="line"><a id="l01815" name="l01815"></a><span class="lineno"> 1815</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01816" name="l01816"></a><span class="lineno"> 1816</span>    peer2-&gt;async_end_sending(&amp;sync_err_code2, std::move(combined_on_done));</div>
<div class="line"><a id="l01817" name="l01817"></a><span class="lineno"> 1817</span>    assert(ok &amp;&amp; <span class="stringliteral">&quot;Either both should be dupe-calls or neither; do not use them individually only to then use this.&quot;</span>);</div>
<div class="line"><a id="l01818" name="l01818"></a><span class="lineno"> 1818</span> </div>
<div class="line"><a id="l01819" name="l01819"></a><span class="lineno"> 1819</span>    <span class="comment">// Now the extra stuff about completing synchronously versus asynchronously.</span></div>
<div class="line"><a id="l01820" name="l01820"></a><span class="lineno"> 1820</span> </div>
<div class="line"><a id="l01821" name="l01821"></a><span class="lineno"> 1821</span>    <span class="keywordflow">if</span> ((sync_err_code1 != <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">error::Code::S_SYNC_IO_WOULD_BLOCK</a>) &amp;&amp;</div>
<div class="line"><a id="l01822" name="l01822"></a><span class="lineno"> 1822</span>        (sync_err_code2 != <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">error::Code::S_SYNC_IO_WOULD_BLOCK</a>))</div>
<div class="line"><a id="l01823" name="l01823"></a><span class="lineno"> 1823</span>    {</div>
<div class="line"><a id="l01824" name="l01824"></a><span class="lineno"> 1824</span>      <span class="comment">// Both synchronously finished.</span></div>
<div class="line"><a id="l01825" name="l01825"></a><span class="lineno"> 1825</span>      <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a> sync_err_code = sync_err_code1 ? sync_err_code1 : sync_err_code2;</div>
<div class="line"><a id="l01826" name="l01826"></a><span class="lineno"> 1826</span>      <span class="comment">// Standard error-reporting semantics.</span></div>
<div class="line"><a id="l01827" name="l01827"></a><span class="lineno"> 1827</span>      <span class="keywordflow">if</span> ((!sync_err_code_ptr) &amp;&amp; sync_err_code)</div>
<div class="line"><a id="l01828" name="l01828"></a><span class="lineno"> 1828</span>      {</div>
<div class="line"><a id="l01829" name="l01829"></a><span class="lineno"> 1829</span>        <span class="keywordflow">throw</span> flow::error::Runtime_error(sync_err_code, <span class="stringliteral">&quot;Channel::async_end_sending(2)&quot;</span>);</div>
<div class="line"><a id="l01830" name="l01830"></a><span class="lineno"> 1830</span>      }</div>
<div class="line"><a id="l01831" name="l01831"></a><span class="lineno"> 1831</span>      <span class="comment">// else</span></div>
<div class="line"><a id="l01832" name="l01832"></a><span class="lineno"> 1832</span>      sync_err_code_ptr &amp;&amp; (*sync_err_code_ptr = sync_err_code);</div>
<div class="line"><a id="l01833" name="l01833"></a><span class="lineno"> 1833</span>      <span class="comment">// And if (!sync_err_code_ptr) + no error =&gt; no throw.</span></div>
<div class="line"><a id="l01834" name="l01834"></a><span class="lineno"> 1834</span>      <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01835" name="l01835"></a><span class="lineno"> 1835</span>    }</div>
<div class="line"><a id="l01836" name="l01836"></a><span class="lineno"> 1836</span>    <span class="comment">// else: 1 or neither synchronously finished.  So we return would-block, while those 1-2 finish.</span></div>
<div class="line"><a id="l01837" name="l01837"></a><span class="lineno"> 1837</span>    <span class="keywordflow">if</span> (sync_err_code1 != <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">error::Code::S_SYNC_IO_WOULD_BLOCK</a>)</div>
<div class="line"><a id="l01838" name="l01838"></a><span class="lineno"> 1838</span>    {</div>
<div class="line"><a id="l01839" name="l01839"></a><span class="lineno"> 1839</span>      ++state-&gt;m_n_done; <span class="comment">// Simulate it being done already, so the other one (if even needed) will run user handler.</span></div>
<div class="line"><a id="l01840" name="l01840"></a><span class="lineno"> 1840</span>      state-&gt;m_err_code1 = sync_err_code1;</div>
<div class="line"><a id="l01841" name="l01841"></a><span class="lineno"> 1841</span>    }</div>
<div class="line"><a id="l01842" name="l01842"></a><span class="lineno"> 1842</span>    <span class="keywordflow">else</span> <span class="keywordflow">if</span> (sync_err_code2 != <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">error::Code::S_SYNC_IO_WOULD_BLOCK</a>)</div>
<div class="line"><a id="l01843" name="l01843"></a><span class="lineno"> 1843</span>    {</div>
<div class="line"><a id="l01844" name="l01844"></a><span class="lineno"> 1844</span>      ++state-&gt;m_n_done; <span class="comment">// Ditto.</span></div>
<div class="line"><a id="l01845" name="l01845"></a><span class="lineno"> 1845</span>      state-&gt;m_err_code1 = sync_err_code2;</div>
<div class="line"><a id="l01846" name="l01846"></a><span class="lineno"> 1846</span>    }</div>
<div class="line"><a id="l01847" name="l01847"></a><span class="lineno"> 1847</span>    <span class="comment">// else { Neither synchronously finished. }</span></div>
<div class="line"><a id="l01848" name="l01848"></a><span class="lineno"> 1848</span> </div>
<div class="line"><a id="l01849" name="l01849"></a><span class="lineno"> 1849</span>    <span class="comment">// Okay, godspeed to the 1-2 remaining async ones.</span></div>
<div class="line"><a id="l01850" name="l01850"></a><span class="lineno"> 1850</span>    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01851" name="l01851"></a><span class="lineno"> 1851</span>  } <span class="comment">// else if constexpr(HAS_2_PIPES)</span></div>
<div class="line"><a id="l01852" name="l01852"></a><span class="lineno"> 1852</span>} <span class="comment">// Channel::async_end_sending(2)</span></div>
<div class="line"><a id="l01853" name="l01853"></a><span class="lineno"> 1853</span> </div>
<div class="line"><a id="l01854" name="l01854"></a><span class="lineno"> 1854</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01855" name="l01855"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a060e37759dc6f0a00d92fc23a0a09f4f"> 1855</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::end_sending()</div>
<div class="line"><a id="l01856" name="l01856"></a><span class="lineno"> 1856</span>{</div>
<div class="line"><a id="l01857" name="l01857"></a><span class="lineno"> 1857</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_BLOB_PIPE_ONLY)</div>
<div class="line"><a id="l01858" name="l01858"></a><span class="lineno"> 1858</span>  {</div>
<div class="line"><a id="l01859" name="l01859"></a><span class="lineno"> 1859</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_snd();</div>
<div class="line"><a id="l01860" name="l01860"></a><span class="lineno"> 1860</span>    assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01861" name="l01861"></a><span class="lineno"> 1861</span> </div>
<div class="line"><a id="l01862" name="l01862"></a><span class="lineno"> 1862</span>    <span class="keywordflow">return</span> peer-&gt;end_sending();</div>
<div class="line"><a id="l01863" name="l01863"></a><span class="lineno"> 1863</span>  }</div>
<div class="line"><a id="l01864" name="l01864"></a><span class="lineno"> 1864</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_NATIVE_HANDLE_PIPE_ONLY)</div>
<div class="line"><a id="l01865" name="l01865"></a><span class="lineno"> 1865</span>  {</div>
<div class="line"><a id="l01866" name="l01866"></a><span class="lineno"> 1866</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_snd();</div>
<div class="line"><a id="l01867" name="l01867"></a><span class="lineno"> 1867</span>    assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01868" name="l01868"></a><span class="lineno"> 1868</span> </div>
<div class="line"><a id="l01869" name="l01869"></a><span class="lineno"> 1869</span>    <span class="keywordflow">return</span> peer-&gt;end_sending();</div>
<div class="line"><a id="l01870" name="l01870"></a><span class="lineno"> 1870</span>  }</div>
<div class="line"><a id="l01871" name="l01871"></a><span class="lineno"> 1871</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l01872" name="l01872"></a><span class="lineno"> 1872</span>  {</div>
<div class="line"><a id="l01873" name="l01873"></a><span class="lineno"> 1873</span>    <span class="keyword">static_assert</span>(S_HAS_2_PIPES, <span class="stringliteral">&quot;Wat!&quot;</span>);</div>
<div class="line"><a id="l01874" name="l01874"></a><span class="lineno"> 1874</span> </div>
<div class="line"><a id="l01875" name="l01875"></a><span class="lineno"> 1875</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer1 = blob_snd();</div>
<div class="line"><a id="l01876" name="l01876"></a><span class="lineno"> 1876</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer2 = hndl_snd();</div>
<div class="line"><a id="l01877" name="l01877"></a><span class="lineno"> 1877</span>    assert(peer1 &amp;&amp; peer2 &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01878" name="l01878"></a><span class="lineno"> 1878</span> </div>
<div class="line"><a id="l01879" name="l01879"></a><span class="lineno"> 1879</span>    <span class="keywordflow">if</span> (!peer1-&gt;end_sending())</div>
<div class="line"><a id="l01880" name="l01880"></a><span class="lineno"> 1880</span>    {</div>
<div class="line"><a id="l01881" name="l01881"></a><span class="lineno"> 1881</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01882" name="l01882"></a><span class="lineno"> 1882</span>    }</div>
<div class="line"><a id="l01883" name="l01883"></a><span class="lineno"> 1883</span>    <span class="comment">// else see our contract.</span></div>
<div class="line"><a id="l01884" name="l01884"></a><span class="lineno"> 1884</span> </div>
<div class="line"><a id="l01885" name="l01885"></a><span class="lineno"> 1885</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l01886" name="l01886"></a><span class="lineno"> 1886</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> ok =</div>
<div class="line"><a id="l01887" name="l01887"></a><span class="lineno"> 1887</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01888" name="l01888"></a><span class="lineno"> 1888</span>    peer2-&gt;end_sending();</div>
<div class="line"><a id="l01889" name="l01889"></a><span class="lineno"> 1889</span>    assert(ok &amp;&amp; <span class="stringliteral">&quot;Either both should be dupe-calls or neither; do not use them individually only to then use this.&quot;</span>);</div>
<div class="line"><a id="l01890" name="l01890"></a><span class="lineno"> 1890</span>    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01891" name="l01891"></a><span class="lineno"> 1891</span>  }</div>
<div class="line"><a id="l01892" name="l01892"></a><span class="lineno"> 1892</span>} <span class="comment">// Channel::end_sending()</span></div>
<div class="line"><a id="l01893" name="l01893"></a><span class="lineno"> 1893</span> </div>
<div class="line"><a id="l01894" name="l01894"></a><span class="lineno"> 1894</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01895" name="l01895"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a290395d720167759bfa1eda1e86bf123"> 1895</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::auto_ping(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a> period)</div>
<div class="line"><a id="l01896" name="l01896"></a><span class="lineno"> 1896</span>{</div>
<div class="line"><a id="l01897" name="l01897"></a><span class="lineno"> 1897</span>  <span class="comment">// @todo This is very similar to end_sending().  Add some code reuse.  This code is simple but not that short.</span></div>
<div class="line"><a id="l01898" name="l01898"></a><span class="lineno"> 1898</span> </div>
<div class="line"><a id="l01899" name="l01899"></a><span class="lineno"> 1899</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_BLOB_PIPE_ONLY)</div>
<div class="line"><a id="l01900" name="l01900"></a><span class="lineno"> 1900</span>  {</div>
<div class="line"><a id="l01901" name="l01901"></a><span class="lineno"> 1901</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_snd();</div>
<div class="line"><a id="l01902" name="l01902"></a><span class="lineno"> 1902</span>    assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01903" name="l01903"></a><span class="lineno"> 1903</span> </div>
<div class="line"><a id="l01904" name="l01904"></a><span class="lineno"> 1904</span>    <span class="keywordflow">return</span> peer-&gt;auto_ping(period);</div>
<div class="line"><a id="l01905" name="l01905"></a><span class="lineno"> 1905</span>  }</div>
<div class="line"><a id="l01906" name="l01906"></a><span class="lineno"> 1906</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_NATIVE_HANDLE_PIPE_ONLY)</div>
<div class="line"><a id="l01907" name="l01907"></a><span class="lineno"> 1907</span>  {</div>
<div class="line"><a id="l01908" name="l01908"></a><span class="lineno"> 1908</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_snd();</div>
<div class="line"><a id="l01909" name="l01909"></a><span class="lineno"> 1909</span>    assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01910" name="l01910"></a><span class="lineno"> 1910</span> </div>
<div class="line"><a id="l01911" name="l01911"></a><span class="lineno"> 1911</span>    <span class="keywordflow">return</span> peer-&gt;auto_ping(period);</div>
<div class="line"><a id="l01912" name="l01912"></a><span class="lineno"> 1912</span>  }</div>
<div class="line"><a id="l01913" name="l01913"></a><span class="lineno"> 1913</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l01914" name="l01914"></a><span class="lineno"> 1914</span>  {</div>
<div class="line"><a id="l01915" name="l01915"></a><span class="lineno"> 1915</span>    <span class="keyword">static_assert</span>(S_HAS_2_PIPES, <span class="stringliteral">&quot;Wat!&quot;</span>);</div>
<div class="line"><a id="l01916" name="l01916"></a><span class="lineno"> 1916</span> </div>
<div class="line"><a id="l01917" name="l01917"></a><span class="lineno"> 1917</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer1 = blob_snd();</div>
<div class="line"><a id="l01918" name="l01918"></a><span class="lineno"> 1918</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer2 = hndl_snd();</div>
<div class="line"><a id="l01919" name="l01919"></a><span class="lineno"> 1919</span>    assert(peer1 &amp;&amp; peer2 &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01920" name="l01920"></a><span class="lineno"> 1920</span> </div>
<div class="line"><a id="l01921" name="l01921"></a><span class="lineno"> 1921</span>    <span class="keywordflow">if</span> (!peer1-&gt;auto_ping(period))</div>
<div class="line"><a id="l01922" name="l01922"></a><span class="lineno"> 1922</span>    {</div>
<div class="line"><a id="l01923" name="l01923"></a><span class="lineno"> 1923</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01924" name="l01924"></a><span class="lineno"> 1924</span>    }</div>
<div class="line"><a id="l01925" name="l01925"></a><span class="lineno"> 1925</span>    <span class="comment">// else see our contract.</span></div>
<div class="line"><a id="l01926" name="l01926"></a><span class="lineno"> 1926</span> </div>
<div class="line"><a id="l01927" name="l01927"></a><span class="lineno"> 1927</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l01928" name="l01928"></a><span class="lineno"> 1928</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> ok =</div>
<div class="line"><a id="l01929" name="l01929"></a><span class="lineno"> 1929</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01930" name="l01930"></a><span class="lineno"> 1930</span>    peer2-&gt;auto_ping(period);</div>
<div class="line"><a id="l01931" name="l01931"></a><span class="lineno"> 1931</span>    assert(ok &amp;&amp; <span class="stringliteral">&quot;Either both should be dupe-calls or neither; do not use them individually only to then use this.&quot;</span>);</div>
<div class="line"><a id="l01932" name="l01932"></a><span class="lineno"> 1932</span>    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01933" name="l01933"></a><span class="lineno"> 1933</span>  }</div>
<div class="line"><a id="l01934" name="l01934"></a><span class="lineno"> 1934</span>} <span class="comment">// Channel::auto_ping()</span></div>
<div class="line"><a id="l01935" name="l01935"></a><span class="lineno"> 1935</span> </div>
<div class="line"><a id="l01936" name="l01936"></a><span class="lineno"> 1936</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01937" name="l01937"></a><span class="lineno"> 1937</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Args&gt;</div>
<div class="line"><a id="l01938" name="l01938"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a1e6d2b4ec45f629b731fe30f46aeca97"> 1938</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::async_receive_blob(Args&amp;&amp;... args)</div>
<div class="line"><a id="l01939" name="l01939"></a><span class="lineno"> 1939</span>{</div>
<div class="line"><a id="l01940" name="l01940"></a><span class="lineno"> 1940</span>  <span class="keyword">static_assert</span>(S_HAS_BLOB_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01941" name="l01941"></a><span class="lineno"> 1941</span> </div>
<div class="line"><a id="l01942" name="l01942"></a><span class="lineno"> 1942</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_rcv();</div>
<div class="line"><a id="l01943" name="l01943"></a><span class="lineno"> 1943</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01944" name="l01944"></a><span class="lineno"> 1944</span> </div>
<div class="line"><a id="l01945" name="l01945"></a><span class="lineno"> 1945</span>  <span class="keywordflow">return</span> peer-&gt;async_receive_blob(std::forward&lt;Args&gt;(args)...);</div>
<div class="line"><a id="l01946" name="l01946"></a><span class="lineno"> 1946</span>}</div>
<div class="line"><a id="l01947" name="l01947"></a><span class="lineno"> 1947</span> </div>
<div class="line"><a id="l01948" name="l01948"></a><span class="lineno"> 1948</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01949" name="l01949"></a><span class="lineno"> 1949</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span>... Args&gt;</div>
<div class="line"><a id="l01950" name="l01950"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a288e61b4e19b9621f4f978fab88bcab0"> 1950</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::async_receive_native_handle(Args&amp;&amp;... args)</div>
<div class="line"><a id="l01951" name="l01951"></a><span class="lineno"> 1951</span>{</div>
<div class="line"><a id="l01952" name="l01952"></a><span class="lineno"> 1952</span>  <span class="keyword">static_assert</span>(S_HAS_NATIVE_HANDLE_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l01953" name="l01953"></a><span class="lineno"> 1953</span> </div>
<div class="line"><a id="l01954" name="l01954"></a><span class="lineno"> 1954</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_rcv();</div>
<div class="line"><a id="l01955" name="l01955"></a><span class="lineno"> 1955</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01956" name="l01956"></a><span class="lineno"> 1956</span> </div>
<div class="line"><a id="l01957" name="l01957"></a><span class="lineno"> 1957</span>  <span class="keywordflow">return</span> peer-&gt;async_receive_native_handle(std::forward&lt;Args&gt;(args)...);</div>
<div class="line"><a id="l01958" name="l01958"></a><span class="lineno"> 1958</span>}</div>
<div class="line"><a id="l01959" name="l01959"></a><span class="lineno"> 1959</span> </div>
<div class="line"><a id="l01960" name="l01960"></a><span class="lineno"> 1960</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l01961" name="l01961"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#abf25364b49b9fdd3ba4b1541b3a50356"> 1961</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::idle_timer_run(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a> timeout)</div>
<div class="line"><a id="l01962" name="l01962"></a><span class="lineno"> 1962</span>{</div>
<div class="line"><a id="l01963" name="l01963"></a><span class="lineno"> 1963</span>  <span class="comment">// @todo This is very similar to auto_ping().  Add some code reuse.  This code is simple but not that short.</span></div>
<div class="line"><a id="l01964" name="l01964"></a><span class="lineno"> 1964</span> </div>
<div class="line"><a id="l01965" name="l01965"></a><span class="lineno"> 1965</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_BLOB_PIPE_ONLY)</div>
<div class="line"><a id="l01966" name="l01966"></a><span class="lineno"> 1966</span>  {</div>
<div class="line"><a id="l01967" name="l01967"></a><span class="lineno"> 1967</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_rcv();</div>
<div class="line"><a id="l01968" name="l01968"></a><span class="lineno"> 1968</span>    assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01969" name="l01969"></a><span class="lineno"> 1969</span> </div>
<div class="line"><a id="l01970" name="l01970"></a><span class="lineno"> 1970</span>    <span class="keywordflow">return</span> peer-&gt;idle_timer_run(timeout);</div>
<div class="line"><a id="l01971" name="l01971"></a><span class="lineno"> 1971</span>  }</div>
<div class="line"><a id="l01972" name="l01972"></a><span class="lineno"> 1972</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_NATIVE_HANDLE_PIPE_ONLY)</div>
<div class="line"><a id="l01973" name="l01973"></a><span class="lineno"> 1973</span>  {</div>
<div class="line"><a id="l01974" name="l01974"></a><span class="lineno"> 1974</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_rcv();</div>
<div class="line"><a id="l01975" name="l01975"></a><span class="lineno"> 1975</span>    assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01976" name="l01976"></a><span class="lineno"> 1976</span> </div>
<div class="line"><a id="l01977" name="l01977"></a><span class="lineno"> 1977</span>    <span class="keywordflow">return</span> peer-&gt;idle_timer_run(timeout);</div>
<div class="line"><a id="l01978" name="l01978"></a><span class="lineno"> 1978</span>  }</div>
<div class="line"><a id="l01979" name="l01979"></a><span class="lineno"> 1979</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l01980" name="l01980"></a><span class="lineno"> 1980</span>  {</div>
<div class="line"><a id="l01981" name="l01981"></a><span class="lineno"> 1981</span>    <span class="keyword">static_assert</span>(S_HAS_2_PIPES, <span class="stringliteral">&quot;Wat!&quot;</span>);</div>
<div class="line"><a id="l01982" name="l01982"></a><span class="lineno"> 1982</span> </div>
<div class="line"><a id="l01983" name="l01983"></a><span class="lineno"> 1983</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer1 = blob_rcv();</div>
<div class="line"><a id="l01984" name="l01984"></a><span class="lineno"> 1984</span>    <span class="keyword">const</span> <span class="keyword">auto</span> peer2 = hndl_rcv();</div>
<div class="line"><a id="l01985" name="l01985"></a><span class="lineno"> 1985</span>    assert(peer1 &amp;&amp; peer2 &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l01986" name="l01986"></a><span class="lineno"> 1986</span> </div>
<div class="line"><a id="l01987" name="l01987"></a><span class="lineno"> 1987</span>    <span class="keywordflow">if</span> (!peer1-&gt;idle_timer_run(timeout))</div>
<div class="line"><a id="l01988" name="l01988"></a><span class="lineno"> 1988</span>    {</div>
<div class="line"><a id="l01989" name="l01989"></a><span class="lineno"> 1989</span>      <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l01990" name="l01990"></a><span class="lineno"> 1990</span>    }</div>
<div class="line"><a id="l01991" name="l01991"></a><span class="lineno"> 1991</span>    <span class="comment">// else see our contract.</span></div>
<div class="line"><a id="l01992" name="l01992"></a><span class="lineno"> 1992</span> </div>
<div class="line"><a id="l01993" name="l01993"></a><span class="lineno"> 1993</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l01994" name="l01994"></a><span class="lineno"> 1994</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> ok =</div>
<div class="line"><a id="l01995" name="l01995"></a><span class="lineno"> 1995</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l01996" name="l01996"></a><span class="lineno"> 1996</span>    peer2-&gt;idle_timer_run(timeout);</div>
<div class="line"><a id="l01997" name="l01997"></a><span class="lineno"> 1997</span>    assert(ok &amp;&amp; <span class="stringliteral">&quot;Either both should be dupe-calls or neither; do not use them individually only to then use this.&quot;</span>);</div>
<div class="line"><a id="l01998" name="l01998"></a><span class="lineno"> 1998</span>    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l01999" name="l01999"></a><span class="lineno"> 1999</span>  }</div>
<div class="line"><a id="l02000" name="l02000"></a><span class="lineno"> 2000</span>} <span class="comment">// Channel::idle_timer_run()</span></div>
<div class="line"><a id="l02001" name="l02001"></a><span class="lineno"> 2001</span> </div>
<div class="line"><a id="l02002" name="l02002"></a><span class="lineno"> 2002</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02003" name="l02003"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ab62f46ceaf85baac6820415808c3a2f2"> 2003</a></span><span class="keywordtype">size_t</span> CLASS_CHANNEL::send_blob_max_size()<span class="keyword"> const</span></div>
<div class="line"><a id="l02004" name="l02004"></a><span class="lineno"> 2004</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02005" name="l02005"></a><span class="lineno"> 2005</span>  <span class="keyword">static_assert</span>(S_HAS_BLOB_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l02006" name="l02006"></a><span class="lineno"> 2006</span> </div>
<div class="line"><a id="l02007" name="l02007"></a><span class="lineno"> 2007</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_snd();</div>
<div class="line"><a id="l02008" name="l02008"></a><span class="lineno"> 2008</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l02009" name="l02009"></a><span class="lineno"> 2009</span> </div>
<div class="line"><a id="l02010" name="l02010"></a><span class="lineno"> 2010</span>  <span class="keywordflow">return</span> peer-&gt;send_blob_max_size();</div>
<div class="line"><a id="l02011" name="l02011"></a><span class="lineno"> 2011</span>}</div>
<div class="line"><a id="l02012" name="l02012"></a><span class="lineno"> 2012</span> </div>
<div class="line"><a id="l02013" name="l02013"></a><span class="lineno"> 2013</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02014" name="l02014"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a37e1f03a11d1e1df9148048a8a6bab62"> 2014</a></span><span class="keywordtype">size_t</span> CLASS_CHANNEL::send_meta_blob_max_size()<span class="keyword"> const</span></div>
<div class="line"><a id="l02015" name="l02015"></a><span class="lineno"> 2015</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02016" name="l02016"></a><span class="lineno"> 2016</span>  <span class="keyword">static_assert</span>(S_HAS_NATIVE_HANDLE_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l02017" name="l02017"></a><span class="lineno"> 2017</span> </div>
<div class="line"><a id="l02018" name="l02018"></a><span class="lineno"> 2018</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_snd();</div>
<div class="line"><a id="l02019" name="l02019"></a><span class="lineno"> 2019</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l02020" name="l02020"></a><span class="lineno"> 2020</span> </div>
<div class="line"><a id="l02021" name="l02021"></a><span class="lineno"> 2021</span>  <span class="keywordflow">return</span> peer-&gt;send_meta_blob_max_size();</div>
<div class="line"><a id="l02022" name="l02022"></a><span class="lineno"> 2022</span>}</div>
<div class="line"><a id="l02023" name="l02023"></a><span class="lineno"> 2023</span> </div>
<div class="line"><a id="l02024" name="l02024"></a><span class="lineno"> 2024</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02025" name="l02025"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a5e181ca69bd2b38d0e3585a1d9303318"> 2025</a></span><span class="keywordtype">size_t</span> CLASS_CHANNEL::receive_blob_max_size()<span class="keyword"> const</span></div>
<div class="line"><a id="l02026" name="l02026"></a><span class="lineno"> 2026</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02027" name="l02027"></a><span class="lineno"> 2027</span>  <span class="keyword">static_assert</span>(S_HAS_BLOB_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l02028" name="l02028"></a><span class="lineno"> 2028</span> </div>
<div class="line"><a id="l02029" name="l02029"></a><span class="lineno"> 2029</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_rcv();</div>
<div class="line"><a id="l02030" name="l02030"></a><span class="lineno"> 2030</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l02031" name="l02031"></a><span class="lineno"> 2031</span> </div>
<div class="line"><a id="l02032" name="l02032"></a><span class="lineno"> 2032</span>  <span class="keywordflow">return</span> peer-&gt;receive_blob_max_size();</div>
<div class="line"><a id="l02033" name="l02033"></a><span class="lineno"> 2033</span>}</div>
<div class="line"><a id="l02034" name="l02034"></a><span class="lineno"> 2034</span> </div>
<div class="line"><a id="l02035" name="l02035"></a><span class="lineno"> 2035</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02036" name="l02036"></a><span class="lineno"> 2036</span><span class="keywordtype">size_t</span></div>
<div class="line"><a id="l02037" name="l02037"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#afd9589e9bee2aec1574ab534cf4b3782"> 2037</a></span>  CLASS_CHANNEL::receive_meta_blob_max_size()<span class="keyword"> const</span></div>
<div class="line"><a id="l02038" name="l02038"></a><span class="lineno"> 2038</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02039" name="l02039"></a><span class="lineno"> 2039</span>  <span class="keyword">static_assert</span>(S_HAS_NATIVE_HANDLE_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l02040" name="l02040"></a><span class="lineno"> 2040</span> </div>
<div class="line"><a id="l02041" name="l02041"></a><span class="lineno"> 2041</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_rcv();</div>
<div class="line"><a id="l02042" name="l02042"></a><span class="lineno"> 2042</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l02043" name="l02043"></a><span class="lineno"> 2043</span> </div>
<div class="line"><a id="l02044" name="l02044"></a><span class="lineno"> 2044</span>  <span class="keywordflow">return</span> peer-&gt;receive_meta_blob_max_size();</div>
<div class="line"><a id="l02045" name="l02045"></a><span class="lineno"> 2045</span>}</div>
<div class="line"><a id="l02046" name="l02046"></a><span class="lineno"> 2046</span> </div>
<div class="line"><a id="l02047" name="l02047"></a><span class="lineno"> 2047</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02048" name="l02048"></a><span class="lineno"> 2048</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Create_ev_wait_hndl_func&gt;</div>
<div class="line"><a id="l02049" name="l02049"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ae63c4f7dbe1a1855d46a4b4d7009d5e8"> 2049</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::replace_event_wait_handles(<span class="keyword">const</span> Create_ev_wait_hndl_func&amp; create_ev_wait_hndl_func)</div>
<div class="line"><a id="l02050" name="l02050"></a><span class="lineno"> 2050</span>{</div>
<div class="line"><a id="l02051" name="l02051"></a><span class="lineno"> 2051</span>  <span class="keyword">static_assert</span>(S_IS_SYNC_IO_OBJ, <span class="stringliteral">&quot;This overload usable only with sync_io-pattern object.&quot;</span>);</div>
<div class="line"><a id="l02052" name="l02052"></a><span class="lineno"> 2052</span> </div>
<div class="line"><a id="l02053" name="l02053"></a><span class="lineno"> 2053</span>  <span class="comment">/* There will be a compile error below if we&#39;re not a sync_io:: type dude.  @todo static_assert() somehow for</span></div>
<div class="line"><a id="l02054" name="l02054"></a><span class="lineno"> 2054</span><span class="comment">   * a nicer compile error. */</span></div>
<div class="line"><a id="l02055" name="l02055"></a><span class="lineno"> 2055</span> </div>
<div class="line"><a id="l02056" name="l02056"></a><span class="lineno"> 2056</span>  assert(initialized() &amp;&amp; <span class="stringliteral">&quot;It is in the contract, man.&quot;</span>);</div>
<div class="line"><a id="l02057" name="l02057"></a><span class="lineno"> 2057</span> </div>
<div class="line"><a id="l02058" name="l02058"></a><span class="lineno"> 2058</span>  <span class="comment">// We could have fancier compile-time checks but doesn&#39;t seem worth it perf-wise.</span></div>
<div class="line"><a id="l02059" name="l02059"></a><span class="lineno"> 2059</span> </div>
<div class="line"><a id="l02060" name="l02060"></a><span class="lineno"> 2060</span>  <span class="comment">// Ensure all the applicable ones run.</span></div>
<div class="line"><a id="l02061" name="l02061"></a><span class="lineno"> 2061</span>  <span class="keywordtype">bool</span> ok1 = <span class="keyword">true</span>;</div>
<div class="line"><a id="l02062" name="l02062"></a><span class="lineno"> 2062</span>  <span class="keywordtype">bool</span> ok2 = <span class="keyword">true</span>;</div>
<div class="line"><a id="l02063" name="l02063"></a><span class="lineno"> 2063</span>  <span class="keywordtype">bool</span> ok3 = <span class="keyword">true</span>;</div>
<div class="line"><a id="l02064" name="l02064"></a><span class="lineno"> 2064</span>  <span class="keywordtype">bool</span> ok4 = <span class="keyword">true</span>;</div>
<div class="line"><a id="l02065" name="l02065"></a><span class="lineno"> 2065</span> </div>
<div class="line"><a id="l02066" name="l02066"></a><span class="lineno"> 2066</span>  <span class="comment">/* Forced to make a copy of the function, possibly a few times, but hopefully it&#39;s not perf-critical.</span></div>
<div class="line"><a id="l02067" name="l02067"></a><span class="lineno"> 2067</span><span class="comment">   * We could do it fewer times depending on the scenario, but again don&#39;t bother. */</span></div>
<div class="line"><a id="l02068" name="l02068"></a><span class="lineno"> 2068</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_BLOB_PIPE)</div>
<div class="line"><a id="l02069" name="l02069"></a><span class="lineno"> 2069</span>  {</div>
<div class="line"><a id="l02070" name="l02070"></a><span class="lineno"> 2070</span>    <span class="keywordflow">if</span> (m_blob_snd)</div>
<div class="line"><a id="l02071" name="l02071"></a><span class="lineno"> 2071</span>    {</div>
<div class="line"><a id="l02072" name="l02072"></a><span class="lineno"> 2072</span>      ok1 = m_blob_snd-&gt;replace_event_wait_handles(create_ev_wait_hndl_func);</div>
<div class="line"><a id="l02073" name="l02073"></a><span class="lineno"> 2073</span>    }</div>
<div class="line"><a id="l02074" name="l02074"></a><span class="lineno"> 2074</span>    <span class="keywordflow">if</span> (m_blob_rcv)</div>
<div class="line"><a id="l02075" name="l02075"></a><span class="lineno"> 2075</span>    {</div>
<div class="line"><a id="l02076" name="l02076"></a><span class="lineno"> 2076</span>      ok2 = m_blob_rcv-&gt;replace_event_wait_handles(create_ev_wait_hndl_func);</div>
<div class="line"><a id="l02077" name="l02077"></a><span class="lineno"> 2077</span>    }</div>
<div class="line"><a id="l02078" name="l02078"></a><span class="lineno"> 2078</span>  }</div>
<div class="line"><a id="l02079" name="l02079"></a><span class="lineno"> 2079</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(S_HAS_NATIVE_HANDLE_PIPE)</div>
<div class="line"><a id="l02080" name="l02080"></a><span class="lineno"> 2080</span>  {</div>
<div class="line"><a id="l02081" name="l02081"></a><span class="lineno"> 2081</span>    <span class="keywordflow">if</span> (m_hndl_snd)</div>
<div class="line"><a id="l02082" name="l02082"></a><span class="lineno"> 2082</span>    {</div>
<div class="line"><a id="l02083" name="l02083"></a><span class="lineno"> 2083</span>      ok3 = m_hndl_snd-&gt;replace_event_wait_handles(create_ev_wait_hndl_func);</div>
<div class="line"><a id="l02084" name="l02084"></a><span class="lineno"> 2084</span>    }</div>
<div class="line"><a id="l02085" name="l02085"></a><span class="lineno"> 2085</span>    <span class="keywordflow">if</span> (m_hndl_rcv)</div>
<div class="line"><a id="l02086" name="l02086"></a><span class="lineno"> 2086</span>    {</div>
<div class="line"><a id="l02087" name="l02087"></a><span class="lineno"> 2087</span>      ok4 = m_hndl_rcv-&gt;replace_event_wait_handles(create_ev_wait_hndl_func);</div>
<div class="line"><a id="l02088" name="l02088"></a><span class="lineno"> 2088</span>    }</div>
<div class="line"><a id="l02089" name="l02089"></a><span class="lineno"> 2089</span>  }</div>
<div class="line"><a id="l02090" name="l02090"></a><span class="lineno"> 2090</span>  <span class="keywordflow">return</span> ok1 &amp;&amp; ok2 &amp;&amp; ok3 &amp;&amp; ok4;</div>
<div class="line"><a id="l02091" name="l02091"></a><span class="lineno"> 2091</span>} <span class="comment">// Channel::replace_event_wait_handles()</span></div>
<div class="line"><a id="l02092" name="l02092"></a><span class="lineno"> 2092</span> </div>
<div class="line"><a id="l02093" name="l02093"></a><span class="lineno"> 2093</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02094" name="l02094"></a><span class="lineno"> 2094</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Event_wait_func_t&gt;</div>
<div class="line"><a id="l02095" name="l02095"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#aabafc3beaf1a57e4767c023d9c4f9f93"> 2095</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::start_send_blob_ops(Event_wait_func_t&amp;&amp; ev_wait_func)</div>
<div class="line"><a id="l02096" name="l02096"></a><span class="lineno"> 2096</span>{</div>
<div class="line"><a id="l02097" name="l02097"></a><span class="lineno"> 2097</span>  <span class="keyword">static_assert</span>(S_IS_SYNC_IO_OBJ, <span class="stringliteral">&quot;This overload usable only with sync_io-pattern object.&quot;</span>);</div>
<div class="line"><a id="l02098" name="l02098"></a><span class="lineno"> 2098</span>  <span class="keyword">static_assert</span>(S_HAS_BLOB_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l02099" name="l02099"></a><span class="lineno"> 2099</span> </div>
<div class="line"><a id="l02100" name="l02100"></a><span class="lineno"> 2100</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_snd();</div>
<div class="line"><a id="l02101" name="l02101"></a><span class="lineno"> 2101</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l02102" name="l02102"></a><span class="lineno"> 2102</span> </div>
<div class="line"><a id="l02103" name="l02103"></a><span class="lineno"> 2103</span>  <span class="keywordflow">return</span> peer-&gt;start_send_blob_ops(std::move(ev_wait_func));</div>
<div class="line"><a id="l02104" name="l02104"></a><span class="lineno"> 2104</span>}</div>
<div class="line"><a id="l02105" name="l02105"></a><span class="lineno"> 2105</span> </div>
<div class="line"><a id="l02106" name="l02106"></a><span class="lineno"> 2106</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02107" name="l02107"></a><span class="lineno"> 2107</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Event_wait_func_t&gt;</div>
<div class="line"><a id="l02108" name="l02108"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#ac2413ad0e4178fc321e71b5fe4ca2ce2"> 2108</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::start_send_native_handle_ops(Event_wait_func_t&amp;&amp; ev_wait_func)</div>
<div class="line"><a id="l02109" name="l02109"></a><span class="lineno"> 2109</span>{</div>
<div class="line"><a id="l02110" name="l02110"></a><span class="lineno"> 2110</span>  <span class="keyword">static_assert</span>(S_IS_SYNC_IO_OBJ, <span class="stringliteral">&quot;This overload usable only with sync_io-pattern object.&quot;</span>);</div>
<div class="line"><a id="l02111" name="l02111"></a><span class="lineno"> 2111</span>  <span class="keyword">static_assert</span>(S_HAS_NATIVE_HANDLE_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l02112" name="l02112"></a><span class="lineno"> 2112</span> </div>
<div class="line"><a id="l02113" name="l02113"></a><span class="lineno"> 2113</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_snd();</div>
<div class="line"><a id="l02114" name="l02114"></a><span class="lineno"> 2114</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l02115" name="l02115"></a><span class="lineno"> 2115</span> </div>
<div class="line"><a id="l02116" name="l02116"></a><span class="lineno"> 2116</span>  <span class="keywordflow">return</span> peer-&gt;start_send_native_handle_ops(std::move(ev_wait_func));</div>
<div class="line"><a id="l02117" name="l02117"></a><span class="lineno"> 2117</span>}</div>
<div class="line"><a id="l02118" name="l02118"></a><span class="lineno"> 2118</span> </div>
<div class="line"><a id="l02119" name="l02119"></a><span class="lineno"> 2119</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02120" name="l02120"></a><span class="lineno"> 2120</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Event_wait_func_t&gt;</div>
<div class="line"><a id="l02121" name="l02121"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a0b00c99196fbe8c154f14dbf8f0ceb79"> 2121</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::start_receive_blob_ops(Event_wait_func_t&amp;&amp; ev_wait_func)</div>
<div class="line"><a id="l02122" name="l02122"></a><span class="lineno"> 2122</span>{</div>
<div class="line"><a id="l02123" name="l02123"></a><span class="lineno"> 2123</span>  <span class="keyword">static_assert</span>(S_IS_SYNC_IO_OBJ, <span class="stringliteral">&quot;This overload usable only with sync_io-pattern object.&quot;</span>);</div>
<div class="line"><a id="l02124" name="l02124"></a><span class="lineno"> 2124</span>  <span class="keyword">static_assert</span>(S_HAS_BLOB_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l02125" name="l02125"></a><span class="lineno"> 2125</span> </div>
<div class="line"><a id="l02126" name="l02126"></a><span class="lineno"> 2126</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = blob_rcv();</div>
<div class="line"><a id="l02127" name="l02127"></a><span class="lineno"> 2127</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l02128" name="l02128"></a><span class="lineno"> 2128</span> </div>
<div class="line"><a id="l02129" name="l02129"></a><span class="lineno"> 2129</span>  <span class="keywordflow">return</span> peer-&gt;start_receive_blob_ops(std::move(ev_wait_func));</div>
<div class="line"><a id="l02130" name="l02130"></a><span class="lineno"> 2130</span>}</div>
<div class="line"><a id="l02131" name="l02131"></a><span class="lineno"> 2131</span> </div>
<div class="line"><a id="l02132" name="l02132"></a><span class="lineno"> 2132</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02133" name="l02133"></a><span class="lineno"> 2133</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Event_wait_func_t&gt;</div>
<div class="line"><a id="l02134" name="l02134"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a61f7ffbf72ee0fe46997ae08f9adaeb2"> 2134</a></span><span class="keywordtype">bool</span> CLASS_CHANNEL::start_receive_native_handle_ops(Event_wait_func_t&amp;&amp; ev_wait_func)</div>
<div class="line"><a id="l02135" name="l02135"></a><span class="lineno"> 2135</span>{</div>
<div class="line"><a id="l02136" name="l02136"></a><span class="lineno"> 2136</span>  <span class="keyword">static_assert</span>(S_IS_SYNC_IO_OBJ, <span class="stringliteral">&quot;This overload usable only with sync_io-pattern object.&quot;</span>);</div>
<div class="line"><a id="l02137" name="l02137"></a><span class="lineno"> 2137</span>  <span class="keyword">static_assert</span>(S_HAS_NATIVE_HANDLE_PIPE, <span class="stringliteral">&quot;Compilable only given the compile-time presence of that pipe.&quot;</span>);</div>
<div class="line"><a id="l02138" name="l02138"></a><span class="lineno"> 2138</span> </div>
<div class="line"><a id="l02139" name="l02139"></a><span class="lineno"> 2139</span>  <span class="keyword">const</span> <span class="keyword">auto</span> peer = hndl_rcv();</div>
<div class="line"><a id="l02140" name="l02140"></a><span class="lineno"> 2140</span>  assert(peer &amp;&amp; <span class="stringliteral">&quot;Ensure initialized() first.&quot;</span>);</div>
<div class="line"><a id="l02141" name="l02141"></a><span class="lineno"> 2141</span> </div>
<div class="line"><a id="l02142" name="l02142"></a><span class="lineno"> 2142</span>  <span class="keywordflow">return</span> peer-&gt;start_receive_native_handle_ops(std::move(ev_wait_func));</div>
<div class="line"><a id="l02143" name="l02143"></a><span class="lineno"> 2143</span>}</div>
<div class="line"><a id="l02144" name="l02144"></a><span class="lineno"> 2144</span> </div>
<div class="line"><a id="l02145" name="l02145"></a><span class="lineno"> 2145</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02146" name="l02146"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a212c7e77daa038fc45dc118894e80af0"> 2146</a></span><span class="keyword">const</span> std::string&amp; CLASS_CHANNEL::nickname()<span class="keyword"> const</span></div>
<div class="line"><a id="l02147" name="l02147"></a><span class="lineno"> 2147</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02148" name="l02148"></a><span class="lineno"> 2148</span>  <span class="keywordflow">return</span> m_nickname;</div>
<div class="line"><a id="l02149" name="l02149"></a><span class="lineno"> 2149</span>}</div>
<div class="line"><a id="l02150" name="l02150"></a><span class="lineno"> 2150</span> </div>
<div class="line"><a id="l02151" name="l02151"></a><span class="lineno"> 2151</span><a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div>
<div class="line"><a id="l02152" name="l02152"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Channel.html#a8eff22e594b6fe82f94f13d6a172537f"> 2152</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceipc_1_1transport.html#a61c80019823537694f925275dccb4f3f">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_define" href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#aa498064773ba3aad9a5828df463739a7">CLASS_CHANNEL</a>&amp; val)</div>
<div class="line"><a id="l02153" name="l02153"></a><span class="lineno"> 2153</span>{</div>
<div class="line"><a id="l02154" name="l02154"></a><span class="lineno"> 2154</span>  <span class="keyword">using </span>std::string;</div>
<div class="line"><a id="l02155" name="l02155"></a><span class="lineno"> 2155</span> </div>
<div class="line"><a id="l02156" name="l02156"></a><span class="lineno"> 2156</span>  os &lt;&lt; <span class="charliteral">&#39;[&#39;</span> &lt;&lt; (val.nickname().empty() ? string(<span class="stringliteral">&quot;null&quot;</span>) : val.nickname()) &lt;&lt; <span class="stringliteral">&quot;]@&quot;</span> &lt;&lt; <span class="keyword">static_cast&lt;</span><span class="keyword">const </span><span class="keywordtype">void</span>*<span class="keyword">&gt;</span>(&amp;val);</div>
<div class="line"><a id="l02157" name="l02157"></a><span class="lineno"> 2157</span> </div>
<div class="line"><a id="l02158" name="l02158"></a><span class="lineno"> 2158</span>  <span class="comment">/* The way this written -- skipping wordy (if technically faster) compile-time checking -- friendship is needed.</span></div>
<div class="line"><a id="l02159" name="l02159"></a><span class="lineno"> 2159</span><span class="comment">   * E.g., if Blob_sender=Null_peer, then m_blob_snd is compiled -- just always null -- but blob_snd() is not</span></div>
<div class="line"><a id="l02160" name="l02160"></a><span class="lineno"> 2160</span><span class="comment">   * compiled.  For conciseness we&#39;d rather just check for null and be done with it, here.  (In other more</span></div>
<div class="line"><a id="l02161" name="l02161"></a><span class="lineno"> 2161</span><span class="comment">   * perf/mission--critical code we are much more stringent; like blob_snd() being un-callable by user in this</span></div>
<div class="line"><a id="l02162" name="l02162"></a><span class="lineno"> 2162</span><span class="comment">   * example.) */</span></div>
<div class="line"><a id="l02163" name="l02163"></a><span class="lineno"> 2163</span> </div>
<div class="line"><a id="l02164" name="l02164"></a><span class="lineno"> 2164</span>  <span class="keywordflow">if</span> (val.m_blob_snd)</div>
<div class="line"><a id="l02165" name="l02165"></a><span class="lineno"> 2165</span>  {</div>
<div class="line"><a id="l02166" name="l02166"></a><span class="lineno"> 2166</span>    os &lt;&lt; <span class="stringliteral">&quot; blob_pipes[&quot;</span>;</div>
<div class="line"><a id="l02167" name="l02167"></a><span class="lineno"> 2167</span>    <span class="keywordflow">if</span> (val.m_blob_rcv)</div>
<div class="line"><a id="l02168" name="l02168"></a><span class="lineno"> 2168</span>    {</div>
<div class="line"><a id="l02169" name="l02169"></a><span class="lineno"> 2169</span>      os &lt;&lt; <span class="stringliteral">&quot;snd_out[&quot;</span> &lt;&lt; *val.m_blob_snd &lt;&lt; <span class="stringliteral">&quot;] rcv_in[&quot;</span> &lt;&lt; *val.m_blob_rcv &lt;&lt; <span class="charliteral">&#39;]&#39;</span>;</div>
<div class="line"><a id="l02170" name="l02170"></a><span class="lineno"> 2170</span>    }</div>
<div class="line"><a id="l02171" name="l02171"></a><span class="lineno"> 2171</span>    <span class="keywordflow">else</span></div>
<div class="line"><a id="l02172" name="l02172"></a><span class="lineno"> 2172</span>    {</div>
<div class="line"><a id="l02173" name="l02173"></a><span class="lineno"> 2173</span>      os &lt;&lt; <span class="stringliteral">&quot;snd_rcv[&quot;</span> &lt;&lt; *val.m_blob_snd &lt;&lt; <span class="charliteral">&#39;]&#39;</span>;</div>
<div class="line"><a id="l02174" name="l02174"></a><span class="lineno"> 2174</span>    }</div>
<div class="line"><a id="l02175" name="l02175"></a><span class="lineno"> 2175</span>  }</div>
<div class="line"><a id="l02176" name="l02176"></a><span class="lineno"> 2176</span> </div>
<div class="line"><a id="l02177" name="l02177"></a><span class="lineno"> 2177</span>  <span class="keywordflow">if</span> (val.m_hndl_snd)</div>
<div class="line"><a id="l02178" name="l02178"></a><span class="lineno"> 2178</span>  {</div>
<div class="line"><a id="l02179" name="l02179"></a><span class="lineno"> 2179</span>    os &lt;&lt; <span class="stringliteral">&quot; hndl_pipes[&quot;</span>;</div>
<div class="line"><a id="l02180" name="l02180"></a><span class="lineno"> 2180</span>    <span class="keywordflow">if</span> (val.m_hndl_rcv)</div>
<div class="line"><a id="l02181" name="l02181"></a><span class="lineno"> 2181</span>    {</div>
<div class="line"><a id="l02182" name="l02182"></a><span class="lineno"> 2182</span>      os &lt;&lt; <span class="stringliteral">&quot;snd_out[&quot;</span> &lt;&lt; *val.m_hndl_snd &lt;&lt; <span class="stringliteral">&quot;] rcv_in[&quot;</span> &lt;&lt; *val.m_hndl_rcv &lt;&lt; <span class="charliteral">&#39;]&#39;</span>;</div>
<div class="line"><a id="l02183" name="l02183"></a><span class="lineno"> 2183</span>    }</div>
<div class="line"><a id="l02184" name="l02184"></a><span class="lineno"> 2184</span>    <span class="keywordflow">else</span></div>
<div class="line"><a id="l02185" name="l02185"></a><span class="lineno"> 2185</span>    {</div>
<div class="line"><a id="l02186" name="l02186"></a><span class="lineno"> 2186</span>      os &lt;&lt; <span class="stringliteral">&quot;snd_rcv[&quot;</span> &lt;&lt; *val.m_hndl_snd &lt;&lt; <span class="charliteral">&#39;]&#39;</span>;</div>
<div class="line"><a id="l02187" name="l02187"></a><span class="lineno"> 2187</span>    }</div>
<div class="line"><a id="l02188" name="l02188"></a><span class="lineno"> 2188</span>  }</div>
<div class="line"><a id="l02189" name="l02189"></a><span class="lineno"> 2189</span> </div>
<div class="line"><a id="l02190" name="l02190"></a><span class="lineno"> 2190</span>  <span class="keywordflow">return</span> os;</div>
<div class="line"><a id="l02191" name="l02191"></a><span class="lineno"> 2191</span>} <span class="comment">// operator&lt;&lt;(ostream&amp;, Channel)</span></div>
<div class="line"><a id="l02192" name="l02192"></a><span class="lineno"> 2192</span> </div>
<div class="line"><a id="l02193" name="l02193"></a><span class="lineno"> 2193</span><span class="preprocessor">#undef CLASS_CHANNEL</span></div>
<div class="line"><a id="l02194" name="l02194"></a><span class="lineno"> 2194</span><span class="preprocessor">#undef TEMPLATE_CHANNEL</span></div>
<div class="line"><a id="l02195" name="l02195"></a><span class="lineno"> 2195</span> </div>
<div class="line"><a id="l02196" name="l02196"></a><span class="lineno"> 2196</span><span class="comment">// Other template implementations.</span></div>
<div class="line"><a id="l02197" name="l02197"></a><span class="lineno"> 2197</span> </div>
<div class="line"><a id="l02198" name="l02198"></a><span class="lineno"> 2198</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO&gt;</div>
<div class="line"><a id="l02199" name="l02199"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Socket__stream__channel.html#a3b718d9c3ef2054a8bb07d7b7de0230c"> 2199</a></span><a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel.html#ad1d5f032926c8c04b302755072274bc5">Socket_stream_channel&lt;SIO&gt;::Socket_stream_channel</a>(flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> nickname_str,</div>
<div class="line"><a id="l02200" name="l02200"></a><span class="lineno"> 2200</span>                                                  <span class="keyword">typename</span> Base::Native_handle_sender_obj&amp;&amp; sock_stm) :</div>
<div class="line"><a id="l02201" name="l02201"></a><span class="lineno"> 2201</span>  <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Base</a>(logger_ptr, nickname_str)</div>
<div class="line"><a id="l02202" name="l02202"></a><span class="lineno"> 2202</span>{</div>
<div class="line"><a id="l02203" name="l02203"></a><span class="lineno"> 2203</span>  <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a0e0e396759dab8c0930594eac3bb03ba">Base::init_native_handle_pipe</a>(std::move(sock_stm));</div>
<div class="line"><a id="l02204" name="l02204"></a><span class="lineno"> 2204</span>  assert(<a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a43c79955b3ad0eab347550b4263523ec">Base::initialized</a>() &amp;&amp; <span class="stringliteral">&quot;Check the logs above this; something is misconfigured, maybe at compile-time.&quot;</span>);</div>
<div class="line"><a id="l02205" name="l02205"></a><span class="lineno"> 2205</span>}</div>
<div class="line"><a id="l02206" name="l02206"></a><span class="lineno"> 2206</span> </div>
<div class="line"><a id="l02207" name="l02207"></a><span class="lineno"> 2207</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO&gt;</div>
<div class="line"><a id="l02208" name="l02208"></a><span class="lineno"> 2208</span><a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel.html#ad1d5f032926c8c04b302755072274bc5">Socket_stream_channel&lt;SIO&gt;::Socket_stream_channel</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l02209" name="l02209"></a><span class="lineno"> 2209</span> </div>
<div class="line"><a id="l02210" name="l02210"></a><span class="lineno"> 2210</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO&gt;</div>
<div class="line"><a id="l02211" name="l02211"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Socket__stream__channel.html#acad7936d9a7db817bc46ee4fe479d838"> 2211</a></span><a class="code hl_class" href="classipc_1_1util_1_1Process__credentials.html">util::Process_credentials</a> <a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel.html#acad7936d9a7db817bc46ee4fe479d838">Socket_stream_channel&lt;SIO&gt;::remote_peer_process_credentials</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)<span class="keyword"> const</span></div>
<div class="line"><a id="l02212" name="l02212"></a><span class="lineno"> 2212</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02213" name="l02213"></a><span class="lineno"> 2213</span>  <span class="keyword">const</span> <span class="keyword">auto</span> stream = Base::hndl_snd();</div>
<div class="line"><a id="l02214" name="l02214"></a><span class="lineno"> 2214</span>  <span class="keywordflow">return</span> stream ? stream-&gt;remote_peer_process_credentials(err_code) : <a class="code hl_class" href="classipc_1_1util_1_1Process__credentials.html">util::Process_credentials</a>();</div>
<div class="line"><a id="l02215" name="l02215"></a><span class="lineno"> 2215</span>}</div>
<div class="line"><a id="l02216" name="l02216"></a><span class="lineno"> 2216</span> </div>
<div class="line"><a id="l02217" name="l02217"></a><span class="lineno"> 2217</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO&gt;</div>
<div class="line"><a id="l02218" name="l02218"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a67046fb25f18b7edf220567eaca4bb83"> 2218</a></span><a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a6ffbd698a432e3b7f0796d589c56f57e">Socket_stream_channel_of_blobs&lt;SIO&gt;::Socket_stream_channel_of_blobs</a>(flow::log::Logger* logger_ptr,</div>
<div class="line"><a id="l02219" name="l02219"></a><span class="lineno"> 2219</span>                                                                    <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> nickname_str,</div>
<div class="line"><a id="l02220" name="l02220"></a><span class="lineno"> 2220</span>                                                                    <span class="keyword">typename</span> Base::Blob_sender_obj&amp;&amp; sock_stm) :</div>
<div class="line"><a id="l02221" name="l02221"></a><span class="lineno"> 2221</span>  <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Base</a>(logger_ptr, nickname_str)</div>
<div class="line"><a id="l02222" name="l02222"></a><span class="lineno"> 2222</span>{</div>
<div class="line"><a id="l02223" name="l02223"></a><span class="lineno"> 2223</span>  <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#aa8209a5adde4e5c2b3b1d8779fab0433">Base::init_blob_pipe</a>(std::move(sock_stm));</div>
<div class="line"><a id="l02224" name="l02224"></a><span class="lineno"> 2224</span>  assert(<a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a43c79955b3ad0eab347550b4263523ec">Base::initialized</a>() &amp;&amp; <span class="stringliteral">&quot;Check the logs above this; something is misconfigured, maybe at compile-time.&quot;</span>);</div>
<div class="line"><a id="l02225" name="l02225"></a><span class="lineno"> 2225</span>}</div>
<div class="line"><a id="l02226" name="l02226"></a><span class="lineno"> 2226</span> </div>
<div class="line"><a id="l02227" name="l02227"></a><span class="lineno"> 2227</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO&gt;</div>
<div class="line"><a id="l02228" name="l02228"></a><span class="lineno"> 2228</span><a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a6ffbd698a432e3b7f0796d589c56f57e">Socket_stream_channel_of_blobs&lt;SIO&gt;::Socket_stream_channel_of_blobs</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l02229" name="l02229"></a><span class="lineno"> 2229</span> </div>
<div class="line"><a id="l02230" name="l02230"></a><span class="lineno"> 2230</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO&gt;</div>
<div class="line"><a id="l02231" name="l02231"></a><span class="lineno"> 2231</span><a class="code hl_class" href="classipc_1_1util_1_1Process__credentials.html">util::Process_credentials</a></div>
<div class="line"><a id="l02232" name="l02232"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a76c7a2ba5195bf1f6e41823b085670c9"> 2232</a></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a76c7a2ba5195bf1f6e41823b085670c9">Socket_stream_channel_of_blobs&lt;SIO&gt;::remote_peer_process_credentials</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)<span class="keyword"> const</span></div>
<div class="line"><a id="l02233" name="l02233"></a><span class="lineno"> 2233</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02234" name="l02234"></a><span class="lineno"> 2234</span>  <span class="keyword">const</span> <span class="keyword">auto</span> stream = Base::blob_snd();</div>
<div class="line"><a id="l02235" name="l02235"></a><span class="lineno"> 2235</span>  <span class="keywordflow">return</span> stream ? stream-&gt;remote_peer_process_credentials(err_code) : <a class="code hl_class" href="classipc_1_1util_1_1Process__credentials.html">util::Process_credentials</a>();</div>
<div class="line"><a id="l02236" name="l02236"></a><span class="lineno"> 2236</span>}</div>
<div class="line"><a id="l02237" name="l02237"></a><span class="lineno"> 2237</span> </div>
<div class="line"><a id="l02238" name="l02238"></a><span class="lineno"> 2238</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO, <span class="keyword">typename</span> Persistent_mq_handle, <span class="keyword">typename</span> Native_handle_sender, <span class="keyword">typename</span> Native_handle_receiver&gt;</div>
<div class="line"><a id="l02239" name="l02239"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__channel.html#a3d51b0a0be20d9c3ce93b239290ea188"> 2239</a></span><a class="code hl_function" href="classipc_1_1transport_1_1Mqs__channel.html#af829b5841e1bc1c23f254bc344b147ab">Mqs_channel&lt;SIO, Persistent_mq_handle, Native_handle_sender, Native_handle_receiver&gt;::Mqs_channel</a></div>
<div class="line"><a id="l02240" name="l02240"></a><span class="lineno"> 2240</span>  (flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> nickname_str, <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Mq</a>&amp;&amp; mq_out, <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Mq</a>&amp;&amp; mq_in, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code) :</div>
<div class="line"><a id="l02241" name="l02241"></a><span class="lineno"> 2241</span> </div>
<div class="line"><a id="l02242" name="l02242"></a><span class="lineno"> 2242</span>  <a class="code hl_class" href="classipc_1_1transport_1_1Channel.html">Base</a>(logger_ptr, nickname_str)</div>
<div class="line"><a id="l02243" name="l02243"></a><span class="lineno"> 2243</span>{</div>
<div class="line"><a id="l02244" name="l02244"></a><span class="lineno"> 2244</span>  <span class="keyword">using </span>flow::error::Runtime_error;</div>
<div class="line"><a id="l02245" name="l02245"></a><span class="lineno"> 2245</span>  <span class="keyword">using </span>flow::util::ostream_op_string;</div>
<div class="line"><a id="l02246" name="l02246"></a><span class="lineno"> 2246</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a>;</div>
<div class="line"><a id="l02247" name="l02247"></a><span class="lineno"> 2247</span> </div>
<div class="line"><a id="l02248" name="l02248"></a><span class="lineno"> 2248</span>  <span class="comment">/* We must create a Blob_stream_mq_sender(mq_out) and Blob_stream_mq_receiver(mq_in), in that order;</span></div>
<div class="line"><a id="l02249" name="l02249"></a><span class="lineno"> 2249</span><span class="comment">   * and do the latter only if the former doesn&#39;t fail; and report the 1st (and only) error to occur; or</span></div>
<div class="line"><a id="l02250" name="l02250"></a><span class="lineno"> 2250</span><span class="comment">   * report success if no problem occurs.  Oh and we must observe the usual error reporting semantics wherein</span></div>
<div class="line"><a id="l02251" name="l02251"></a><span class="lineno"> 2251</span><span class="comment">   * err_code==null =&gt; throw Runtime_error(&lt;the error code&gt;) on error/don&#39;t throw on success;</span></div>
<div class="line"><a id="l02252" name="l02252"></a><span class="lineno"> 2252</span><span class="comment">   * err_code!=null =&gt; set *err_code to truthy on error/falsy on success.</span></div>
<div class="line"><a id="l02253" name="l02253"></a><span class="lineno"> 2253</span><span class="comment">   *</span></div>
<div class="line"><a id="l02254" name="l02254"></a><span class="lineno"> 2254</span><span class="comment">   * So... that&#39;s what all that stuff below does.  Hopefully it&#39;s not too complicated to follow given the above. */</span></div>
<div class="line"><a id="l02255" name="l02255"></a><span class="lineno"> 2255</span> </div>
<div class="line"><a id="l02256" name="l02256"></a><span class="lineno"> 2256</span>  <span class="comment">// Regardless: The last op&#39;s result is stored here.</span></div>
<div class="line"><a id="l02257" name="l02257"></a><span class="lineno"> 2257</span>  <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a> our_err_code;</div>
<div class="line"><a id="l02258" name="l02258"></a><span class="lineno"> 2258</span> </div>
<div class="line"><a id="l02259" name="l02259"></a><span class="lineno"> 2259</span>  <span class="comment">// A little helper to invoke after each op: no-op if successful; else either throw or set *err_code on failure.</span></div>
<div class="line"><a id="l02260" name="l02260"></a><span class="lineno"> 2260</span>  <span class="keyword">const</span> <span class="keyword">auto</span> handle_result = [&amp;](<span class="keywordtype">bool</span> snd_else_rcv)</div>
<div class="line"><a id="l02261" name="l02261"></a><span class="lineno"> 2261</span>  {</div>
<div class="line"><a id="l02262" name="l02262"></a><span class="lineno"> 2262</span>    <span class="keywordflow">if</span> (our_err_code)</div>
<div class="line"><a id="l02263" name="l02263"></a><span class="lineno"> 2263</span>    {</div>
<div class="line"><a id="l02264" name="l02264"></a><span class="lineno"> 2264</span>      <span class="keywordflow">if</span> (err_code)</div>
<div class="line"><a id="l02265" name="l02265"></a><span class="lineno"> 2265</span>      {</div>
<div class="line"><a id="l02266" name="l02266"></a><span class="lineno"> 2266</span>        *err_code = our_err_code;</div>
<div class="line"><a id="l02267" name="l02267"></a><span class="lineno"> 2267</span>        <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02268" name="l02268"></a><span class="lineno"> 2268</span>      }</div>
<div class="line"><a id="l02269" name="l02269"></a><span class="lineno"> 2269</span>      <span class="comment">// else</span></div>
<div class="line"><a id="l02270" name="l02270"></a><span class="lineno"> 2270</span>      <span class="keywordflow">throw</span> Runtime_error(our_err_code,</div>
<div class="line"><a id="l02271" name="l02271"></a><span class="lineno"> 2271</span>                          ostream_op_string(<span class="stringliteral">&quot;Mqs_channel::Mqs_channel():&quot;</span>,</div>
<div class="line"><a id="l02272" name="l02272"></a><span class="lineno"> 2272</span>                                            snd_else_rcv ? <span class="stringliteral">&quot;mq_snd_init&quot;</span> : <span class="stringliteral">&quot;mq_rcv_init&quot;</span>));</div>
<div class="line"><a id="l02273" name="l02273"></a><span class="lineno"> 2273</span>    }</div>
<div class="line"><a id="l02274" name="l02274"></a><span class="lineno"> 2274</span>    <span class="comment">// else our_err_code is still success.</span></div>
<div class="line"><a id="l02275" name="l02275"></a><span class="lineno"> 2275</span>  };</div>
<div class="line"><a id="l02276" name="l02276"></a><span class="lineno"> 2276</span> </div>
<div class="line"><a id="l02277" name="l02277"></a><span class="lineno"> 2277</span>  <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Blob__sender.html">Base::Blob_sender_obj</a> snd_out(logger_ptr, nickname_str, std::move(mq_out), &amp;our_err_code);</div>
<div class="line"><a id="l02278" name="l02278"></a><span class="lineno"> 2278</span>  handle_result(<span class="keyword">true</span>); <span class="comment">// May throw.</span></div>
<div class="line"><a id="l02279" name="l02279"></a><span class="lineno"> 2279</span>  <span class="keyword">typename</span> <a class="code hl_class" href="classipc_1_1transport_1_1Blob__receiver.html">Base::Blob_receiver_obj</a> rcv_in;</div>
<div class="line"><a id="l02280" name="l02280"></a><span class="lineno"> 2280</span>  <span class="keywordflow">if</span> (!our_err_code) <span class="comment">// As promised: don&#39;t try to initialize the 2nd if the 1st failed anyway.</span></div>
<div class="line"><a id="l02281" name="l02281"></a><span class="lineno"> 2281</span>  {</div>
<div class="line"><a id="l02282" name="l02282"></a><span class="lineno"> 2282</span>    rcv_in = <span class="keyword">typename</span> <a class="code hl_typedef" href="classipc_1_1transport_1_1Channel.html#aa9a7ec2d2eedfc3b6a1d2edfb05ea6d1">Base::Blob_receiver_obj</a>(logger_ptr, nickname_str, std::move(mq_in), &amp;our_err_code);</div>
<div class="line"><a id="l02283" name="l02283"></a><span class="lineno"> 2283</span>    handle_result(<span class="keyword">false</span>); <span class="comment">// May throw.</span></div>
<div class="line"><a id="l02284" name="l02284"></a><span class="lineno"> 2284</span>  }</div>
<div class="line"><a id="l02285" name="l02285"></a><span class="lineno"> 2285</span> </div>
<div class="line"><a id="l02286" name="l02286"></a><span class="lineno"> 2286</span>  <span class="comment">// If one threw, then we&#39;re not here (we&#39;ve failed; our job is done).  Otherwise:</span></div>
<div class="line"><a id="l02287" name="l02287"></a><span class="lineno"> 2287</span> </div>
<div class="line"><a id="l02288" name="l02288"></a><span class="lineno"> 2288</span>  <span class="keywordflow">if</span> (our_err_code)</div>
<div class="line"><a id="l02289" name="l02289"></a><span class="lineno"> 2289</span>  {</div>
<div class="line"><a id="l02290" name="l02290"></a><span class="lineno"> 2290</span>    <span class="comment">// There was an error.  We&#39;ve failed; no point in init_blob_pipe().</span></div>
<div class="line"><a id="l02291" name="l02291"></a><span class="lineno"> 2291</span>    assert(err_code &amp;&amp; <span class="stringliteral">&quot;Bug in this ctor?  Problem initializing, but it didn&#39;t throw, yet err_code is null.&quot;</span>);</div>
<div class="line"><a id="l02292" name="l02292"></a><span class="lineno"> 2292</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02293" name="l02293"></a><span class="lineno"> 2293</span>  }</div>
<div class="line"><a id="l02294" name="l02294"></a><span class="lineno"> 2294</span>  <span class="comment">// else if (!our_err_code): We&#39;ve succeeded.</span></div>
<div class="line"><a id="l02295" name="l02295"></a><span class="lineno"> 2295</span> </div>
<div class="line"><a id="l02296" name="l02296"></a><span class="lineno"> 2296</span>  <span class="keywordflow">if</span> (err_code)</div>
<div class="line"><a id="l02297" name="l02297"></a><span class="lineno"> 2297</span>  {</div>
<div class="line"><a id="l02298" name="l02298"></a><span class="lineno"> 2298</span>    <span class="comment">// Non-exception form was invoked, so mark that indeed we succeeded.</span></div>
<div class="line"><a id="l02299" name="l02299"></a><span class="lineno"> 2299</span>    err_code-&gt;clear();</div>
<div class="line"><a id="l02300" name="l02300"></a><span class="lineno"> 2300</span>  }</div>
<div class="line"><a id="l02301" name="l02301"></a><span class="lineno"> 2301</span>  <span class="comment">// else { Exception form was invoked.  The fact we didn&#39;t throw = how we mark we&#39;ve succeeded. }</span></div>
<div class="line"><a id="l02302" name="l02302"></a><span class="lineno"> 2302</span> </div>
<div class="line"><a id="l02303" name="l02303"></a><span class="lineno"> 2303</span>  <span class="comment">// We&#39;re good to go.  This can&#39;t fail (throw, or whatever):</span></div>
<div class="line"><a id="l02304" name="l02304"></a><span class="lineno"> 2304</span>  <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#aa8209a5adde4e5c2b3b1d8779fab0433">Base::init_blob_pipe</a>(std::move(snd_out), std::move(rcv_in));</div>
<div class="line"><a id="l02305" name="l02305"></a><span class="lineno"> 2305</span> </div>
<div class="line"><a id="l02306" name="l02306"></a><span class="lineno"> 2306</span>  <span class="keywordflow">if</span> <span class="keyword">constexpr</span>(std::is_same_v&lt;typename Base::Native_handle_sender_obj, Null_peer&gt;)</div>
<div class="line"><a id="l02307" name="l02307"></a><span class="lineno"> 2307</span>  {</div>
<div class="line"><a id="l02308" name="l02308"></a><span class="lineno"> 2308</span>    assert(<a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a43c79955b3ad0eab347550b4263523ec">Base::initialized</a>() &amp;&amp; <span class="stringliteral">&quot;Check the logs above this; something is misconfigured, maybe at compile-time.&quot;</span>);</div>
<div class="line"><a id="l02309" name="l02309"></a><span class="lineno"> 2309</span>  }</div>
<div class="line"><a id="l02310" name="l02310"></a><span class="lineno"> 2310</span>  <span class="comment">// else { Probably some sub-ctor, or whatever, will do init_native_handle_pipe(). }</span></div>
<div class="line"><a id="l02311" name="l02311"></a><span class="lineno"> 2311</span>} <span class="comment">// Mqs_channel::Mqs_channel()</span></div>
<div class="line"><a id="l02312" name="l02312"></a><span class="lineno"> 2312</span> </div>
<div class="line"><a id="l02313" name="l02313"></a><span class="lineno"> 2313</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO, <span class="keyword">typename</span> Persistent_mq_handle, <span class="keyword">typename</span> Native_handle_sender, <span class="keyword">typename</span> Native_handle_receiver&gt;</div>
<div class="line"><a id="l02314" name="l02314"></a><span class="lineno"> 2314</span><a class="code hl_function" href="classipc_1_1transport_1_1Mqs__channel.html#af829b5841e1bc1c23f254bc344b147ab">Mqs_channel&lt;SIO, Persistent_mq_handle, Native_handle_sender, Native_handle_receiver&gt;::Mqs_channel</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l02315" name="l02315"></a><span class="lineno"> 2315</span> </div>
<div class="line"><a id="l02316" name="l02316"></a><span class="lineno"> 2316</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO, <span class="keyword">typename</span> Persistent_mq_handle&gt;</div>
<div class="line"><a id="l02317" name="l02317"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#a4bf79eb5166648f2b84fa47568c8ad3b"> 2317</a></span><a class="code hl_function" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#afb4920318fdcb1070f13a6dc3be07452">Mqs_socket_stream_channel&lt;SIO, Persistent_mq_handle&gt;::Mqs_socket_stream_channel</a></div>
<div class="line"><a id="l02318" name="l02318"></a><span class="lineno"> 2318</span>  (flow::log::Logger* logger_ptr, <a class="code hl_typedef" href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">util::String_view</a> nickname_str, <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Mq</a>&amp;&amp; mq_out, <a class="code hl_class" href="classipc_1_1transport_1_1Persistent__mq__handle.html">Mq</a>&amp;&amp; mq_in,</div>
<div class="line"><a id="l02319" name="l02319"></a><span class="lineno"> 2319</span>   <span class="keyword">typename</span> Base::Base::Native_handle_sender_obj&amp;&amp; sock_stm, <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code) :</div>
<div class="line"><a id="l02320" name="l02320"></a><span class="lineno"> 2320</span> </div>
<div class="line"><a id="l02321" name="l02321"></a><span class="lineno"> 2321</span>  <a class="code hl_class" href="classipc_1_1transport_1_1Mqs__channel.html">Base</a>(logger_ptr, nickname_str, std::move(mq_out), std::move(mq_in), err_code)</div>
<div class="line"><a id="l02322" name="l02322"></a><span class="lineno"> 2322</span>{</div>
<div class="line"><a id="l02323" name="l02323"></a><span class="lineno"> 2323</span>  <span class="comment">// Just have the handles pipe to still init.  But first bail if the blob pipe (MQs) failed init w/o throwing.</span></div>
<div class="line"><a id="l02324" name="l02324"></a><span class="lineno"> 2324</span>  <span class="keywordflow">if</span> (err_code &amp;&amp; *err_code)</div>
<div class="line"><a id="l02325" name="l02325"></a><span class="lineno"> 2325</span>  {</div>
<div class="line"><a id="l02326" name="l02326"></a><span class="lineno"> 2326</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l02327" name="l02327"></a><span class="lineno"> 2327</span>  }</div>
<div class="line"><a id="l02328" name="l02328"></a><span class="lineno"> 2328</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l02329" name="l02329"></a><span class="lineno"> 2329</span> </div>
<div class="line"><a id="l02330" name="l02330"></a><span class="lineno"> 2330</span>  <a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a0e0e396759dab8c0930594eac3bb03ba">Base::Base::init_native_handle_pipe</a>(std::move(sock_stm));</div>
<div class="line"><a id="l02331" name="l02331"></a><span class="lineno"> 2331</span>  assert(<a class="code hl_function" href="classipc_1_1transport_1_1Channel.html#a43c79955b3ad0eab347550b4263523ec">Base::Base::initialized</a>() &amp;&amp; <span class="stringliteral">&quot;Check the logs above this; something is misconfigured, maybe at compile-time.&quot;</span>);</div>
<div class="line"><a id="l02332" name="l02332"></a><span class="lineno"> 2332</span>}</div>
<div class="line"><a id="l02333" name="l02333"></a><span class="lineno"> 2333</span> </div>
<div class="line"><a id="l02334" name="l02334"></a><span class="lineno"> 2334</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO, <span class="keyword">typename</span> Persistent_mq_handle&gt;</div>
<div class="line"><a id="l02335" name="l02335"></a><span class="lineno"> 2335</span><a class="code hl_function" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#afb4920318fdcb1070f13a6dc3be07452">Mqs_socket_stream_channel&lt;SIO, Persistent_mq_handle&gt;::Mqs_socket_stream_channel</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l02336" name="l02336"></a><span class="lineno"> 2336</span> </div>
<div class="line"><a id="l02337" name="l02337"></a><span class="lineno"> 2337</span><span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> SIO, <span class="keyword">typename</span> Persistent_mq_handle&gt;</div>
<div class="line"><a id="l02338" name="l02338"></a><span class="lineno"> 2338</span><a class="code hl_class" href="classipc_1_1util_1_1Process__credentials.html">util::Process_credentials</a></div>
<div class="line"><a id="l02339" name="l02339"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#a9a7aae94a79b9545e0870a6b958171ec"> 2339</a></span>  <a class="code hl_function" href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#a9a7aae94a79b9545e0870a6b958171ec">Mqs_socket_stream_channel&lt;SIO, Persistent_mq_handle&gt;::remote_peer_process_credentials</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)<span class="keyword"> const</span></div>
<div class="line"><a id="l02340" name="l02340"></a><span class="lineno"> 2340</span><span class="keyword"></span>{</div>
<div class="line"><a id="l02341" name="l02341"></a><span class="lineno"> 2341</span>  <span class="keyword">const</span> <span class="keyword">auto</span> stream = Base::Base::hndl_snd();</div>
<div class="line"><a id="l02342" name="l02342"></a><span class="lineno"> 2342</span>  <span class="keywordflow">return</span> stream ? stream-&gt;remote_peer_process_credentials(err_code) : <a class="code hl_class" href="classipc_1_1util_1_1Process__credentials.html">util::Process_credentials</a>();</div>
<div class="line"><a id="l02343" name="l02343"></a><span class="lineno"> 2343</span>}</div>
<div class="line"><a id="l02344" name="l02344"></a><span class="lineno"> 2344</span> </div>
<div class="line"><a id="l02345" name="l02345"></a><span class="lineno"> 2345</span>} <span class="comment">// namespace ipc::transport</span></div>
<div class="ttc" id="ablob__stream__mq__rcv_8hpp_html"><div class="ttname"><a href="blob__stream__mq__rcv_8hpp.html">blob_stream_mq_rcv.hpp</a></div></div>
<div class="ttc" id="ablob__stream__mq__snd_8hpp_html"><div class="ttname"><a href="blob__stream__mq__snd_8hpp.html">blob_stream_mq_snd.hpp</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Blob__receiver_html"><div class="ttname"><a href="classipc_1_1transport_1_1Blob__receiver.html">ipc::transport::Blob_receiver</a></div><div class="ttdoc">A documentation-only concept defining the behavior of an object capable of reliably/in-order receivin...</div><div class="ttdef"><b>Definition:</b> <a href="blob__transport_8hpp_source.html#l00191">blob_transport.hpp:192</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Blob__sender_html"><div class="ttname"><a href="classipc_1_1transport_1_1Blob__sender.html">ipc::transport::Blob_sender</a></div><div class="ttdoc">A documentation-only concept defining the behavior of an object capable of reliably/in-order sending ...</div><div class="ttdef"><b>Definition:</b> <a href="blob__transport_8hpp_source.html#l00046">blob_transport.hpp:47</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Blob__stream__mq__receiver_html"><div class="ttname"><a href="classipc_1_1transport_1_1Blob__stream__mq__receiver.html">ipc::transport::Blob_stream_mq_receiver</a></div><div class="ttdoc">Implements Blob_receiver concept by using an adopted Persistent_mq_handle MQ handle to an MQ (message...</div><div class="ttdef"><b>Definition:</b> <a href="blob__stream__mq__rcv_8hpp_source.html#l00069">blob_stream_mq_rcv.hpp:70</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Blob__stream__mq__sender_html"><div class="ttname"><a href="classipc_1_1transport_1_1Blob__stream__mq__sender.html">ipc::transport::Blob_stream_mq_sender</a></div><div class="ttdoc">Implements Blob_sender concept by using an adopted Persistent_mq_handle MQ handle to an MQ (message q...</div><div class="ttdef"><b>Definition:</b> <a href="blob__stream__mq__snd_8hpp_source.html#l00164">blob_stream_mq_snd.hpp:165</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html">ipc::transport::Channel</a></div><div class="ttdoc">Peer to a bundle of 1-2 full-duplex pipe(s), one for transmitting unstructured binary blobs; the othe...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00306">channel.hpp:308</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a060e37759dc6f0a00d92fc23a0a09f4f"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a060e37759dc6f0a00d92fc23a0a09f4f">ipc::transport::Channel::end_sending</a></div><div class="ttdeci">bool end_sending()</div><div class="ttdoc">Performs hndl_snd()-&gt; and/or blob_snd()-&gt; same method, returning true if all (1-2) invoked methods re...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01855">channel.hpp:1855</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a0b00c99196fbe8c154f14dbf8f0ceb79"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a0b00c99196fbe8c154f14dbf8f0ceb79">ipc::transport::Channel::start_receive_blob_ops</a></div><div class="ttdeci">bool start_receive_blob_ops(Event_wait_func_t &amp;&amp;ev_wait_func)</div><div class="ttdoc">Yields blob_rcv()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02121">channel.hpp:2121</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a0e0e396759dab8c0930594eac3bb03ba"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a0e0e396759dab8c0930594eac3bb03ba">ipc::transport::Channel::init_native_handle_pipe</a></div><div class="ttdeci">bool init_native_handle_pipe(Native_handle_sender_obj &amp;&amp;snd_and_rcv)</div><div class="ttdoc">Analogous to 1-arg init_blob_pipe() but as applied to the handles pipe.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01463">channel.hpp:1463</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a10d97e67296614195f8b14599944dd65"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a10d97e67296614195f8b14599944dd65">ipc::transport::Channel::~Channel</a></div><div class="ttdeci">~Channel()</div><div class="ttdoc">Destructor: synchronously invokes the destructors for each peer object moved-into *this via init_blob...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01420">channel.hpp:1420</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a17af68c92d593c5eb82bbab19156352a"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a17af68c92d593c5eb82bbab19156352a">ipc::transport::Channel::operator=</a></div><div class="ttdeci">Channel &amp; operator=(const Channel &amp;)=delete</div><div class="ttdoc">Copy assignment is disallowed.</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a1e6d2b4ec45f629b731fe30f46aeca97"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a1e6d2b4ec45f629b731fe30f46aeca97">ipc::transport::Channel::async_receive_blob</a></div><div class="ttdeci">bool async_receive_blob(Args &amp;&amp;... args)</div><div class="ttdoc">Yields blob_rcv()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01938">channel.hpp:1938</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a212c7e77daa038fc45dc118894e80af0"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a212c7e77daa038fc45dc118894e80af0">ipc::transport::Channel::nickname</a></div><div class="ttdeci">const std::string &amp; nickname() const</div><div class="ttdoc">Returns nickname, a brief string suitable for logging.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02146">channel.hpp:2146</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a22da0e807ec4dc6c267c376d78753ed3"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a22da0e807ec4dc6c267c376d78753ed3">ipc::transport::Channel::Blob_receiver_ptr</a></div><div class="ttdeci">std::optional&lt; Blob_receiver_obj &gt; Blob_receiver_ptr</div><div class="ttdoc">Short-hand alias for stored object, lifetime [init_blob_pipe(), move-assignment or dtor].</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00933">channel.hpp:933</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a288e61b4e19b9621f4f978fab88bcab0"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a288e61b4e19b9621f4f978fab88bcab0">ipc::transport::Channel::async_receive_native_handle</a></div><div class="ttdeci">bool async_receive_native_handle(Args &amp;&amp;... args)</div><div class="ttdoc">Yields hndl_rcv()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01950">channel.hpp:1950</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a290395d720167759bfa1eda1e86bf123"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a290395d720167759bfa1eda1e86bf123">ipc::transport::Channel::auto_ping</a></div><div class="ttdeci">bool auto_ping(util::Fine_duration period=boost::chrono::seconds(2))</div><div class="ttdoc">Performs hndl_snd()-&gt; and/or blob_snd()-&gt; same method, returning true if all (1-2) invoked methods re...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01895">channel.hpp:1895</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a296d8d152aee83c0c495f80f57daffab"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a296d8d152aee83c0c495f80f57daffab">ipc::transport::Channel::operator&lt;&lt;</a></div><div class="ttdeci">friend std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Channel&lt; Blob_sender2, Blob_receiver2, Native_handle_sender2, Native_handle_receiver2 &gt; &amp;val)</div><div class="ttdoc">Friend of Channel.</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a2e8f56b4542da2d66a438c4bd048236a"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a2e8f56b4542da2d66a438c4bd048236a">ipc::transport::Channel::Blob_sender_ptr</a></div><div class="ttdeci">std::optional&lt; Blob_sender_obj &gt; Blob_sender_ptr</div><div class="ttdoc">Short-hand alias for stored object, lifetime [init_blob_pipe(), move-assignment or dtor].</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00930">channel.hpp:930</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a37e1f03a11d1e1df9148048a8a6bab62"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a37e1f03a11d1e1df9148048a8a6bab62">ipc::transport::Channel::send_meta_blob_max_size</a></div><div class="ttdeci">size_t send_meta_blob_max_size() const</div><div class="ttdoc">Yields hndl_snd()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02014">channel.hpp:2014</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a37fcdfdbefd8ee7e374b0596782ad128"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a37fcdfdbefd8ee7e374b0596782ad128">ipc::transport::Channel::async_end_sending</a></div><div class="ttdeci">bool async_end_sending(Task_err &amp;&amp;on_done_func)</div><div class="ttdoc">Performs hndl_snd()-&gt; and/or blob_snd()-&gt; same method, synthesizing completion handlers into one if a...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01623">channel.hpp:1623</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a387590af263932dbdb24bcac4b399170"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a387590af263932dbdb24bcac4b399170">ipc::transport::Channel::hndl_rcv</a></div><div class="ttdeci">const Native_handle_receiver_obj * hndl_rcv() const</div><div class="ttdoc">Pointer to the immutable owned Native_handle_receiver_obj; null if not yet initialized.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01593">channel.hpp:1593</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a43c79955b3ad0eab347550b4263523ec"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a43c79955b3ad0eab347550b4263523ec">ipc::transport::Channel::initialized</a></div><div class="ttdeci">bool initialized(bool suppress_log=false) const</div><div class="ttdoc">Returns true if and only if the required init_blob_pipe() and init_native_handle_pipe() calls have be...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01501">channel.hpp:1501</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a53cbf199e2ed09b7afb216c96ab63fb0"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a53cbf199e2ed09b7afb216c96ab63fb0">ipc::transport::Channel::async_end_sending</a></div><div class="ttdeci">bool async_end_sending(Error_code *sync_err_code, Task_err &amp;&amp;on_done_func)</div><div class="ttdoc">Performs hndl_snd()-&gt; and/or blob_snd()-&gt; same method, synthesizing completions into one if applicabl...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01735">channel.hpp:1735</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a5a34248f5e11a1dd2d5a52e07ae836e7"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a5a34248f5e11a1dd2d5a52e07ae836e7">ipc::transport::Channel::blob_rcv</a></div><div class="ttdeci">const Blob_receiver_obj * blob_rcv() const</div><div class="ttdoc">Pointer to the immutable owned Blob_receiver_obj; null if not yet initialized.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01581">channel.hpp:1581</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a5e181ca69bd2b38d0e3585a1d9303318"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a5e181ca69bd2b38d0e3585a1d9303318">ipc::transport::Channel::receive_blob_max_size</a></div><div class="ttdeci">size_t receive_blob_max_size() const</div><div class="ttdoc">Yields blob_rcv()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02025">channel.hpp:2025</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a61f7ffbf72ee0fe46997ae08f9adaeb2"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a61f7ffbf72ee0fe46997ae08f9adaeb2">ipc::transport::Channel::start_receive_native_handle_ops</a></div><div class="ttdeci">bool start_receive_native_handle_ops(Event_wait_func_t &amp;&amp;ev_wait_func)</div><div class="ttdoc">Yields hndl_rcv()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02134">channel.hpp:2134</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a634da813ea03c07d8360a738eca002c4"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a634da813ea03c07d8360a738eca002c4">ipc::transport::Channel::S_HAS_BLOB_PIPE_ONLY</a></div><div class="ttdeci">static constexpr bool S_HAS_BLOB_PIPE_ONLY</div><div class="ttdoc">Useful for generic programming: true if and only if types imply only the blobs pipe is enabled.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00364">channel.hpp:364</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a647bc9b6f8b9fb0b546cf3879cb5d4c1"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a647bc9b6f8b9fb0b546cf3879cb5d4c1">ipc::transport::Channel::blob_snd</a></div><div class="ttdeci">Blob_sender_obj * blob_snd()</div><div class="ttdoc">Pointer to the mutable owned Blob_sender_obj; null if yet initialized.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01537">channel.hpp:1537</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a688de69c7de2aef9604b9e868feb3a9e"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a688de69c7de2aef9604b9e868feb3a9e">ipc::transport::Channel::send_blob</a></div><div class="ttdeci">bool send_blob(const util::Blob_const &amp;blob, Error_code *err_code=0)</div><div class="ttdoc">Yields blob_snd()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01599">channel.hpp:1599</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a6d0d2590651b417db4275a9252d52119"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a6d0d2590651b417db4275a9252d52119">ipc::transport::Channel::Native_handle_receiver_ptr</a></div><div class="ttdeci">std::optional&lt; Native_handle_receiver_obj &gt; Native_handle_receiver_ptr</div><div class="ttdoc">Short-hand alias for stored object, lifetime [init_native_handle_pipe(), move-assignment or dtor].</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00939">channel.hpp:939</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a6e95edccbd3d3117f252300d6bcef308"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a6e95edccbd3d3117f252300d6bcef308">ipc::transport::Channel::m_hndl_snd</a></div><div class="ttdeci">Native_handle_sender_ptr m_hndl_snd</div><div class="ttdoc">The Native_handle_sender_obj (sender along the handles pipe).</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00981">channel.hpp:981</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a6fd5dc48222a3cf3eb021fee13c50ea5"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a6fd5dc48222a3cf3eb021fee13c50ea5">ipc::transport::Channel::Channel</a></div><div class="ttdeci">Channel(Channel &amp;&amp;src)</div><div class="ttdoc">Move-constructs from src; src becomes as-if default-cted (therefore in ??? state).</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a705d58cfa65f6162b4a7c4f8500e1985"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a705d58cfa65f6162b4a7c4f8500e1985">ipc::transport::Channel::m_nickname</a></div><div class="ttdeci">std::string m_nickname</div><div class="ttdoc">See nickname().</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00953">channel.hpp:953</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a717bffc2086ccf834bc7a1137c1127eb"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a717bffc2086ccf834bc7a1137c1127eb">ipc::transport::Channel::S_HAS_NATIVE_HANDLE_PIPE_ONLY</a></div><div class="ttdeci">static constexpr bool S_HAS_NATIVE_HANDLE_PIPE_ONLY</div><div class="ttdoc">Useful for generic programming: true if and only if types imply only the handles pipe is enabled.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00368">channel.hpp:368</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a798f520982555961dbd5a6176d8d4f0b"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a798f520982555961dbd5a6176d8d4f0b">ipc::transport::Channel::Channel</a></div><div class="ttdeci">Channel(const Channel &amp;)=delete</div><div class="ttdoc">Copy construction is disallowed.</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a7fa3eda5e3488e989ca34a29976324d1"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a7fa3eda5e3488e989ca34a29976324d1">ipc::transport::Channel::Native_handle_sender_ptr</a></div><div class="ttdeci">std::optional&lt; Native_handle_sender_obj &gt; Native_handle_sender_ptr</div><div class="ttdoc">Short-hand alias for stored object, lifetime [init_native_handle_pipe(), move-assignment or dtor].</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00936">channel.hpp:936</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a82746276cc7379a866b12d529780900f"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a82746276cc7379a866b12d529780900f">ipc::transport::Channel&lt; std::conditional_t&lt; SIO, sync_io::Blob_stream_mq_sender&lt; Persistent_mq_handle &gt;, Blob_stream_mq_sender&lt; Persistent_mq_handle &gt; &gt;, std::conditional_t&lt; SIO, sync_io::Blob_stream_mq_receiver&lt; Persistent_mq_handle &gt;, Blob_stream_mq_receiver&lt; Persistent_mq_handle &gt; &gt;, Null_peer, Null_peer &gt;::Blob_sender_obj</a></div><div class="ttdeci">std::conditional_t&lt; SIO, sync_io::Blob_stream_mq_sender&lt; Persistent_mq_handle &gt;, Blob_stream_mq_sender&lt; Persistent_mq_handle &gt; &gt; Blob_sender_obj</div><div class="ttdoc">Alias for Blob_sender template parameter.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00313">channel.hpp:313</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a85184d886cee9b4a0d0e7b67796a238b"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a85184d886cee9b4a0d0e7b67796a238b">ipc::transport::Channel::S_HAS_2_PIPES</a></div><div class="ttdeci">static constexpr bool S_HAS_2_PIPES</div><div class="ttdoc">Useful for generic programming: true if and only if types imply both blobs and handles pipes are enab...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00360">channel.hpp:360</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a864cae23c5a6f318e285d4c2fe65ece4"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a864cae23c5a6f318e285d4c2fe65ece4">ipc::transport::Channel::send_native_handle</a></div><div class="ttdeci">bool send_native_handle(Native_handle hndl_or_null, const util::Blob_const &amp;meta_blob, Error_code *err_code=0)</div><div class="ttdoc">Yields hndl_snd()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01610">channel.hpp:1610</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a87fd94fa483cabd78059a3d1d094880d"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a87fd94fa483cabd78059a3d1d094880d">ipc::transport::Channel::blob_rcv</a></div><div class="ttdeci">Blob_receiver_obj * blob_rcv()</div><div class="ttdoc">Pointer to the mutable owned Blob_receiver_obj; null if not yet initialized.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01544">channel.hpp:1544</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a8f60506c8b6f4165a04626c524cb4022"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a8f60506c8b6f4165a04626c524cb4022">ipc::transport::Channel::operator=</a></div><div class="ttdeci">Channel &amp; operator=(Channel &amp;&amp;src)</div><div class="ttdoc">Move-assigns from src; *this acts as if destructed; src becomes as-if default-cted (therefore in ?...</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a970d77e3a5ac117d9b60dfddbf0914fe"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a970d77e3a5ac117d9b60dfddbf0914fe">ipc::transport::Channel::hndl_snd</a></div><div class="ttdeci">const Native_handle_sender_obj * hndl_snd() const</div><div class="ttdoc">Pointer to the immutable owned Native_handle_sender_obj; null if not yet initialized.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01587">channel.hpp:1587</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a9e1a2db827082d9467bf45ae0bbf64d3"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a9e1a2db827082d9467bf45ae0bbf64d3">ipc::transport::Channel::blob_snd</a></div><div class="ttdeci">const Blob_sender_obj * blob_snd() const</div><div class="ttdoc">Pointer to the immutable owned Blob_sender_obj; null if yet initialized.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01575">channel.hpp:1575</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_a9f75b20b07eff47a69c2b1dbe5c85f84"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#a9f75b20b07eff47a69c2b1dbe5c85f84">ipc::transport::Channel::S_IS_ASYNC_IO_OBJ</a></div><div class="ttdeci">static constexpr bool S_IS_ASYNC_IO_OBJ</div><div class="ttdoc">It equals the reverse of S_IS_SYNC_IO_OBJ.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00386">channel.hpp:387</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_aa8209a5adde4e5c2b3b1d8779fab0433"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#aa8209a5adde4e5c2b3b1d8779fab0433">ipc::transport::Channel::init_blob_pipe</a></div><div class="ttdeci">bool init_blob_pipe(Blob_sender_obj &amp;&amp;snd_and_rcv)</div><div class="ttdoc">Completes initialization of the blobs pipe by taking ownership (via move semantics) of an object that...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01426">channel.hpp:1426</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_aa838026c33e4e422df7cd78d3a426b6a"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#aa838026c33e4e422df7cd78d3a426b6a">ipc::transport::Channel::hndl_snd</a></div><div class="ttdeci">Native_handle_sender_obj * hndl_snd()</div><div class="ttdoc">Pointer to the mutable owned Native_handle_sender_obj; null if not yet initialized.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01556">channel.hpp:1556</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_aa9a7ec2d2eedfc3b6a1d2edfb05ea6d1"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#aa9a7ec2d2eedfc3b6a1d2edfb05ea6d1">ipc::transport::Channel&lt; std::conditional_t&lt; SIO, sync_io::Blob_stream_mq_sender&lt; Persistent_mq_handle &gt;, Blob_stream_mq_sender&lt; Persistent_mq_handle &gt; &gt;, std::conditional_t&lt; SIO, sync_io::Blob_stream_mq_receiver&lt; Persistent_mq_handle &gt;, Blob_stream_mq_receiver&lt; Persistent_mq_handle &gt; &gt;, Null_peer, Null_peer &gt;::Blob_receiver_obj</a></div><div class="ttdeci">std::conditional_t&lt; SIO, sync_io::Blob_stream_mq_receiver&lt; Persistent_mq_handle &gt;, Blob_stream_mq_receiver&lt; Persistent_mq_handle &gt; &gt; Blob_receiver_obj</div><div class="ttdoc">Alias for Blob_receiver template parameter.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00315">channel.hpp:315</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_aabafc3beaf1a57e4767c023d9c4f9f93"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#aabafc3beaf1a57e4767c023d9c4f9f93">ipc::transport::Channel::start_send_blob_ops</a></div><div class="ttdeci">bool start_send_blob_ops(Event_wait_func_t &amp;&amp;ev_wait_func)</div><div class="ttdoc">Yields blob_snd()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02095">channel.hpp:2095</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_aaf3263fa795fabb3f743b14f35827f19"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#aaf3263fa795fabb3f743b14f35827f19">ipc::transport::Channel::m_hndl_rcv</a></div><div class="ttdeci">Native_handle_receiver_ptr m_hndl_rcv</div><div class="ttdoc">If 2-arg init_native_handle_pipe() was used, this is the Native_handle_receiver_obj equivalent of m_h...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00989">channel.hpp:989</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_aafb0767df5f1dfb535c9467ce717f93f"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#aafb0767df5f1dfb535c9467ce717f93f">ipc::transport::Channel::S_HAS_BLOB_PIPE</a></div><div class="ttdeci">static constexpr bool S_HAS_BLOB_PIPE</div><div class="ttdoc">Useful for generic programming: true if and only if types imply at least the blobs pipe is enabled.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00370">channel.hpp:370</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_ab62f46ceaf85baac6820415808c3a2f2"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#ab62f46ceaf85baac6820415808c3a2f2">ipc::transport::Channel::send_blob_max_size</a></div><div class="ttdeci">size_t send_blob_max_size() const</div><div class="ttdoc">Yields blob_snd()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02003">channel.hpp:2003</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_ab6decf2691a2cab6c3b5187bad1e368b"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#ab6decf2691a2cab6c3b5187bad1e368b">ipc::transport::Channel::S_HAS_NATIVE_HANDLE_PIPE</a></div><div class="ttdeci">static constexpr bool S_HAS_NATIVE_HANDLE_PIPE</div><div class="ttdoc">Useful for generic programming: true if and only if types imply at least the handles pipe is enabled.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00372">channel.hpp:372</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_ab961f45ec4416bfa010df7b9a6e4f40a"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#ab961f45ec4416bfa010df7b9a6e4f40a">ipc::transport::Channel::Channel</a></div><div class="ttdeci">Channel(flow::log::Logger *logger_ptr, util::String_view nickname_str)</div><div class="ttdoc">Constructs Channel in ??? state with the intention to continue initialization via init_blob_pipe() an...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01358">channel.hpp:1358</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_abc969fa7785f5acda19a0c08bfeeb7e9"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#abc969fa7785f5acda19a0c08bfeeb7e9">ipc::transport::Channel::init_blob_pipe</a></div><div class="ttdeci">bool init_blob_pipe(Blob_sender_obj &amp;&amp;snd, Blob_receiver_obj &amp;&amp;rcv)</div><div class="ttdoc">Completes initialization of the blobs pipe by taking ownership (via move semantics) of separate Blob_...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01449">channel.hpp:1449</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_abf25364b49b9fdd3ba4b1541b3a50356"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#abf25364b49b9fdd3ba4b1541b3a50356">ipc::transport::Channel::idle_timer_run</a></div><div class="ttdeci">bool idle_timer_run(util::Fine_duration timeout=boost::chrono::seconds(5))</div><div class="ttdoc">Performs hndl_rcv()-&gt; and/or blob_rcv()-&gt; same method, returning true if all (1-2) invoked methods re...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01961">channel.hpp:1961</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_ac2413ad0e4178fc321e71b5fe4ca2ce2"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#ac2413ad0e4178fc321e71b5fe4ca2ce2">ipc::transport::Channel::start_send_native_handle_ops</a></div><div class="ttdeci">bool start_send_native_handle_ops(Event_wait_func_t &amp;&amp;ev_wait_func)</div><div class="ttdoc">Yields hndl_snd()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02108">channel.hpp:2108</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_add016cbac936d3da6c861755ac88b7a2"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#add016cbac936d3da6c861755ac88b7a2">ipc::transport::Channel::async_io_obj</a></div><div class="ttdeci">Async_io_obj async_io_obj()</div><div class="ttdoc">Converts a sync_io-peer-bearing *this to a returned async-I/O-peer-bearing new Channel,...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01368">channel.hpp:1368</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_ae5be240d29389d7b728950e85df0704e"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#ae5be240d29389d7b728950e85df0704e">ipc::transport::Channel::S_IS_SYNC_IO_OBJ</a></div><div class="ttdeci">static constexpr bool S_IS_SYNC_IO_OBJ</div><div class="ttdoc">Useful for generic programming: true &lt;=&gt; each non-Null_peer peer type (Blob_sender_obj,...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00379">channel.hpp:380</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_ae63c4f7dbe1a1855d46a4b4d7009d5e8"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#ae63c4f7dbe1a1855d46a4b4d7009d5e8">ipc::transport::Channel::replace_event_wait_handles</a></div><div class="ttdeci">bool replace_event_wait_handles(const Create_ev_wait_hndl_func &amp;create_ev_wait_hndl_func)</div><div class="ttdoc">Executes same method on all unique stored peer objects; returns true if and only if they all did.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02049">channel.hpp:2049</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_ae7f2b8a45af59c073fa91f74be0439d8"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#ae7f2b8a45af59c073fa91f74be0439d8">ipc::transport::Channel::Channel</a></div><div class="ttdeci">Channel()</div><div class="ttdoc">Default ctor (Channel is in ??? state; intended to be move-assigned).</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01351">channel.hpp:1351</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_af1f8a47479c75a2daf0a37f384325168"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#af1f8a47479c75a2daf0a37f384325168">ipc::transport::Channel::m_blob_rcv</a></div><div class="ttdeci">Blob_receiver_ptr m_blob_rcv</div><div class="ttdoc">If 2-arg init_blob_pipe() was used, this is the Blob_sender_obj equivalent of m_blob_snd; else null.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00971">channel.hpp:971</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_af4c9cd7b02193fa2e8bf1742ab87111a"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#af4c9cd7b02193fa2e8bf1742ab87111a">ipc::transport::Channel::hndl_rcv</a></div><div class="ttdeci">Native_handle_receiver_obj * hndl_rcv()</div><div class="ttdoc">Pointer to the mutable owned Native_handle_receiver_obj; null if not yet initialized.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01563">channel.hpp:1563</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_afa221b9b60aa9de1aa8dfcb0c1cabec1"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#afa221b9b60aa9de1aa8dfcb0c1cabec1">ipc::transport::Channel::init_native_handle_pipe</a></div><div class="ttdeci">bool init_native_handle_pipe(Native_handle_sender_obj &amp;&amp;snd, Native_handle_receiver_obj &amp;&amp;rcv)</div><div class="ttdoc">Analogous to 2-arg init_blob_pipe() but as applied to the handles pipe.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01486">channel.hpp:1486</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_afc600491e137c9dc16c202b04885a36a"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#afc600491e137c9dc16c202b04885a36a">ipc::transport::Channel&lt; Null_peer, Null_peer, std::conditional_t&lt; SIO, sync_io::Native_socket_stream, Native_socket_stream &gt;, std::conditional_t&lt; SIO, sync_io::Native_socket_stream, Native_socket_stream &gt; &gt;::Native_handle_sender_obj</a></div><div class="ttdeci">std::conditional_t&lt; SIO, sync_io::Native_socket_stream, Native_socket_stream &gt; Native_handle_sender_obj</div><div class="ttdoc">Alias for Native_handle_sender template parameter.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00317">channel.hpp:317</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_afce8f777b5400d5d1cb4f811052e2158"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#afce8f777b5400d5d1cb4f811052e2158">ipc::transport::Channel::m_blob_snd</a></div><div class="ttdeci">Blob_sender_ptr m_blob_snd</div><div class="ttdoc">The Blob_sender_obj (sender along the blobs pipe).</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00963">channel.hpp:963</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Channel_html_afd9589e9bee2aec1574ab534cf4b3782"><div class="ttname"><a href="classipc_1_1transport_1_1Channel.html#afd9589e9bee2aec1574ab534cf4b3782">ipc::transport::Channel::receive_meta_blob_max_size</a></div><div class="ttdeci">size_t receive_meta_blob_max_size() const</div><div class="ttdoc">Yields hndl_rcv()-&gt; same method.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02037">channel.hpp:2037</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Mqs__channel_html"><div class="ttname"><a href="classipc_1_1transport_1_1Mqs__channel.html">ipc::transport::Mqs_channel</a></div><div class="ttdoc">A Channel with at least a blobs pipe consisting of two MQs of type Persistent_mq_handle (template arg...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01174">channel.hpp:1180</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Mqs__channel_html_a3d51b0a0be20d9c3ce93b239290ea188"><div class="ttname"><a href="classipc_1_1transport_1_1Mqs__channel.html#a3d51b0a0be20d9c3ce93b239290ea188">ipc::transport::Mqs_channel::Mqs_channel</a></div><div class="ttdeci">Mqs_channel(flow::log::Logger *logger_ptr, util::String_view nickname_str, Mq &amp;&amp;mq_out, Mq &amp;&amp;mq_in, Error_code *err_code=0)</div><div class="ttdoc">Constructs the Channel in PEER state.</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02239">channel.hpp:2240</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Mqs__channel_html_af829b5841e1bc1c23f254bc344b147ab"><div class="ttname"><a href="classipc_1_1transport_1_1Mqs__channel.html#af829b5841e1bc1c23f254bc344b147ab">ipc::transport::Mqs_channel::Mqs_channel</a></div><div class="ttdeci">Mqs_channel()</div><div class="ttdoc">Identical to Channel default ctor.</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Mqs__socket__stream__channel_html"><div class="ttname"><a href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html">ipc::transport::Mqs_socket_stream_channel</a></div><div class="ttdoc">A Channel with a blobs pipe consisting of 2 MQs of type Persistent_mq_handle (template arg); and a ha...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01273">channel.hpp:1278</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Mqs__socket__stream__channel_html_a9a7aae94a79b9545e0870a6b958171ec"><div class="ttname"><a href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#a9a7aae94a79b9545e0870a6b958171ec">ipc::transport::Mqs_socket_stream_channel::remote_peer_process_credentials</a></div><div class="ttdeci">util::Process_credentials remote_peer_process_credentials(Error_code *err_code=0) const</div><div class="ttdoc">Identical to Native_socket_stream::remote_peer_process_credentials(): OS-reported process credential ...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02339">channel.hpp:2339</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Mqs__socket__stream__channel_html_afb4920318fdcb1070f13a6dc3be07452"><div class="ttname"><a href="classipc_1_1transport_1_1Mqs__socket__stream__channel.html#afb4920318fdcb1070f13a6dc3be07452">ipc::transport::Mqs_socket_stream_channel::Mqs_socket_stream_channel</a></div><div class="ttdeci">Mqs_socket_stream_channel()</div><div class="ttdoc">Identical to Channel default ctor.</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Native__handle__receiver_html"><div class="ttname"><a href="classipc_1_1transport_1_1Native__handle__receiver.html">ipc::transport::Native_handle_receiver</a></div><div class="ttdoc">A documentation-only concept defining the behavior of an object capable of reliably/in-order receivin...</div><div class="ttdef"><b>Definition:</b> <a href="native__handle__transport_8hpp_source.html#l00603">native_handle_transport.hpp:604</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Native__handle__sender_html"><div class="ttname"><a href="classipc_1_1transport_1_1Native__handle__sender.html">ipc::transport::Native_handle_sender</a></div><div class="ttdoc">A documentation-only concept defining the behavior of an object capable of reliably/in-order sending ...</div><div class="ttdef"><b>Definition:</b> <a href="native__handle__transport_8hpp_source.html#l00159">native_handle_transport.hpp:160</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Null__peer_html"><div class="ttname"><a href="classipc_1_1transport_1_1Null__peer.html">ipc::transport::Null_peer</a></div><div class="ttdoc">Dummy type for use as a template param to Channel when either the blobs pipe or handles pipe is disab...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l00999">channel.hpp:1000</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Persistent__mq__handle_html"><div class="ttname"><a href="classipc_1_1transport_1_1Persistent__mq__handle.html">ipc::transport::Persistent_mq_handle</a></div><div class="ttdoc">A documentation-only concept defining the behavior of an object representing a light-weight handle to...</div><div class="ttdef"><b>Definition:</b> <a href="persistent__mq__handle_8hpp_source.html#l00194">persistent_mq_handle.hpp:195</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Socket__stream__channel__of__blobs_html"><div class="ttname"><a href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html">ipc::transport::Socket_stream_channel_of_blobs</a></div><div class="ttdoc">A Channel with a blobs pipe only (no handles pipe) that uses a Unix domain socket connection as the u...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01093">channel.hpp:1097</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Socket__stream__channel__of__blobs_html_a6ffbd698a432e3b7f0796d589c56f57e"><div class="ttname"><a href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a6ffbd698a432e3b7f0796d589c56f57e">ipc::transport::Socket_stream_channel_of_blobs::Socket_stream_channel_of_blobs</a></div><div class="ttdeci">Socket_stream_channel_of_blobs()</div><div class="ttdoc">Identical to Channel default ctor.</div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Socket__stream__channel__of__blobs_html_a76c7a2ba5195bf1f6e41823b085670c9"><div class="ttname"><a href="classipc_1_1transport_1_1Socket__stream__channel__of__blobs.html#a76c7a2ba5195bf1f6e41823b085670c9">ipc::transport::Socket_stream_channel_of_blobs::remote_peer_process_credentials</a></div><div class="ttdeci">util::Process_credentials remote_peer_process_credentials(Error_code *err_code=0) const</div><div class="ttdoc">Identical to Native_socket_stream::remote_peer_process_credentials(): OS-reported process credential ...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02232">channel.hpp:2232</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Socket__stream__channel_html"><div class="ttname"><a href="classipc_1_1transport_1_1Socket__stream__channel.html">ipc::transport::Socket_stream_channel</a></div><div class="ttdoc">A Channel with a handles pipe only (no blobs pipe) that uses a Unix domain socket connection as the u...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01025">channel.hpp:1029</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Socket__stream__channel_html_acad7936d9a7db817bc46ee4fe479d838"><div class="ttname"><a href="classipc_1_1transport_1_1Socket__stream__channel.html#acad7936d9a7db817bc46ee4fe479d838">ipc::transport::Socket_stream_channel::remote_peer_process_credentials</a></div><div class="ttdeci">util::Process_credentials remote_peer_process_credentials(Error_code *err_code=0) const</div><div class="ttdoc">Identical to Native_socket_stream::remote_peer_process_credentials(): OS-reported process credential ...</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l02211">channel.hpp:2211</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Socket__stream__channel_html_ad1d5f032926c8c04b302755072274bc5"><div class="ttname"><a href="classipc_1_1transport_1_1Socket__stream__channel.html#ad1d5f032926c8c04b302755072274bc5">ipc::transport::Socket_stream_channel::Socket_stream_channel</a></div><div class="ttdeci">Socket_stream_channel()</div><div class="ttdoc">Identical to Channel default ctor.</div></div>
<div class="ttc" id="aclassipc_1_1util_1_1Process__credentials_html"><div class="ttname"><a href="classipc_1_1util_1_1Process__credentials.html">ipc::util::Process_credentials</a></div><div class="ttdoc">A process's credentials (PID, UID, GID as of this writing).</div><div class="ttdef"><b>Definition:</b> <a href="process__credentials_8hpp_source.html#l00038">process_credentials.hpp:39</a></div></div>
<div class="ttc" id="aipc__core_2src_2ipc_2transport_2channel_8hpp_html_a5dfdd05a68a4cee245ca6f3393a090b1"><div class="ttname"><a href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#a5dfdd05a68a4cee245ca6f3393a090b1">TEMPLATE_CHANNEL</a></div><div class="ttdeci">#define TEMPLATE_CHANNEL</div><div class="ttdoc">Internally used macro; public API users should disregard (same deal as in struc/channel....</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01344">channel.hpp:1344</a></div></div>
<div class="ttc" id="aipc__core_2src_2ipc_2transport_2channel_8hpp_html_aa498064773ba3aad9a5828df463739a7"><div class="ttname"><a href="ipc__core_2src_2ipc_2transport_2channel_8hpp.html#aa498064773ba3aad9a5828df463739a7">CLASS_CHANNEL</a></div><div class="ttdeci">#define CLASS_CHANNEL</div><div class="ttdoc">Internally used macro; public API users should disregard (same deal as in struc/channel....</div><div class="ttdef"><b>Definition:</b> <a href="ipc__core_2src_2ipc_2transport_2channel_8hpp_source.html#l01347">channel.hpp:1347</a></div></div>
<div class="ttc" id="aipc__core_2src_2ipc_2transport_2error_8hpp_html"><div class="ttname"><a href="ipc__core_2src_2ipc_2transport_2error_8hpp.html">error.hpp</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1error_html_adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24"><div class="ttname"><a href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">ipc::transport::error::Code::S_SYNC_IO_WOULD_BLOCK</a></div><div class="ttdeci">@ S_SYNC_IO_WOULD_BLOCK</div><div class="ttdoc">A sync_io operation could not immediately complete; it will complete contingent on active async-wait ...</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1struc_1_1shm_1_1classic_html_ac543b500a85f556564e592cbbefb6185"><div class="ttname"><a href="namespaceipc_1_1transport_1_1struc_1_1shm_1_1classic.html#ac543b500a85f556564e592cbbefb6185">ipc::transport::struc::shm::classic::Channel</a></div><div class="ttdeci">struc::Channel&lt; Channel_obj, Message_body, Builder::Config, Reader::Config &gt; Channel</div><div class="ttdoc">Convenience alias: Use this when constructing a struc::Channel with tag Channel_base::S_SERIALIZE_VIA...</div><div class="ttdef"><b>Definition:</b> <a href="transport_2struc_2shm_2classic_2classic_8hpp_source.html#l00041">classic.hpp:42</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_html"><div class="ttname"><a href="namespaceipc_1_1transport.html">ipc::transport</a></div><div class="ttdoc">Flow-IPC module providing transmission of structured messages and/or low-level blobs (and more) betwe...</div><div class="ttdef"><b>Definition:</b> <a href="asio__local__stream__socket_8cpp_source.html#l00031">asio_local_stream_socket.cpp:32</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_html_a61c80019823537694f925275dccb4f3f"><div class="ttname"><a href="namespaceipc_1_1transport.html#a61c80019823537694f925275dccb4f3f">ipc::transport::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Bipc_mq_handle &amp;val)</div><div class="ttdoc">Prints string representation of the given Bipc_mq_handle to the given ostream.</div><div class="ttdef"><b>Definition:</b> <a href="bipc__mq__handle_8cpp_source.html#l01029">bipc_mq_handle.cpp:1029</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_ac66141280c3b7295a86b65209f31cc58"><div class="ttname"><a href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">ipc::util::Fine_duration</a></div><div class="ttdeci">flow::Fine_duration Fine_duration</div><div class="ttdoc">Short-hand for Flow's Fine_duration.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00117">util_fwd.hpp:117</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_ae0be7edba7e30ffa3f8b742af621f2ab"><div class="ttname"><a href="namespaceipc_1_1util.html#ae0be7edba7e30ffa3f8b742af621f2ab">ipc::util::Blob_const</a></div><div class="ttdeci">boost::asio::const_buffer Blob_const</div><div class="ttdoc">Short-hand for an immutable blob somewhere in memory, stored as exactly a void const * and a size_t.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00134">util_fwd.hpp:134</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_ae6ac47812a90d1287c61e0b7de7bc4f5"><div class="ttname"><a href="namespaceipc_1_1util.html#ae6ac47812a90d1287c61e0b7de7bc4f5">ipc::util::String_view</a></div><div class="ttdeci">flow::util::String_view String_view</div><div class="ttdoc">Short-hand for Flow's String_view.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00115">util_fwd.hpp:115</a></div></div>
<div class="ttc" id="anamespaceipc_html_a4ccdeed058222c635745a4dc830e99f7"><div class="ttname"><a href="namespaceipc.html#a4ccdeed058222c635745a4dc830e99f7">ipc::Log_component</a></div><div class="ttdeci">Log_component</div><div class="ttdoc">The flow::log::Component payload enumeration containing various log components used by Flow-IPC inter...</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00322">common.hpp:323</a></div></div>
<div class="ttc" id="anamespaceipc_html_aa3192e586cc45d3e7c22463bf2760f89"><div class="ttname"><a href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">ipc::Error_code</a></div><div class="ttdeci">flow::Error_code Error_code</div><div class="ttdoc">Short-hand for flow::Error_code which is very common.</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00298">common.hpp:298</a></div></div>
<div class="ttc" id="anative__socket__stream_8hpp_html"><div class="ttname"><a href="native__socket__stream_8hpp.html">native_socket_stream.hpp</a></div></div>
<div class="ttc" id="aprocess__credentials_8hpp_html"><div class="ttname"><a href="process__credentials_8hpp.html">process_credentials.hpp</a></div></div>
<div class="ttc" id="astructipc_1_1util_1_1Native__handle_html"><div class="ttname"><a href="structipc_1_1util_1_1Native__handle.html">ipc::util::Native_handle</a></div><div class="ttdoc">A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.</div><div class="ttdef"><b>Definition:</b> <a href="native__handle_8hpp_source.html#l00062">native_handle.hpp:63</a></div></div>
<div class="ttc" id="async__io_2blob__stream__mq__rcv_8hpp_html"><div class="ttname"><a href="sync__io_2blob__stream__mq__rcv_8hpp.html">blob_stream_mq_rcv.hpp</a></div></div>
<div class="ttc" id="async__io_2blob__stream__mq__snd_8hpp_html"><div class="ttname"><a href="sync__io_2blob__stream__mq__snd_8hpp.html">blob_stream_mq_snd.hpp</a></div></div>
<div class="ttc" id="async__io_2native__socket__stream_8hpp_html"><div class="ttname"><a href="sync__io_2native__socket__stream_8hpp.html">native_socket_stream.hpp</a></div></div>
<div class="ttc" id="atransport__fwd_8hpp_html"><div class="ttname"><a href="transport__fwd_8hpp.html">transport_fwd.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Thu May 2 2024 23:56:38 for Flow-IPC by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
